Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Canvas не ограниченных размеров и прокрутка 
V
    Опции темы
Anyone
Дата 23.7.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Создал контрол, производный от Canvas, прокрутка осуществляется с помощью 2х скроллбаров, что позволяет абстрагироваться от размеров холста и размещать элементы в больших приделах координат. Как правильно осуществлять скроллинг? Я так понимаю, нужно изменять координаты каждого элемента, а можно подвинуть сразу все содержимое? Вот мой код:
Код

        private void ScrollBarHorisontal_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            Dx = e.OldValue-e.NewValue;
            SetScrollOffset(Dx,0);
        }

        private void ScrollBarVertical_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            Dy = e.OldValue - e.NewValue;
            SetScrollOffset(0, Dy);
        }
        private void SetScrollOffset(double dx, double dy)
        {
            foreach (var item in DrawingCanvas.Children)
            {
                UIElement uiElement = item as UIElement;
                if (uiElement != null)
                {
                    UgeDrawingCanvas.SetLeft(uiElement, UgeDrawingCanvas.GetLeft(uiElement) + dx);
                    UgeDrawingCanvas.SetTop(uiElement, UgeDrawingCanvas.GetTop(uiElement) + dy);
                }
            }
        }


PM MAIL   Вверх
fantast
Дата 24.7.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Конечно можно. Создавай объект TranslateTransform и передавай его в свойство RenderTransform твоего канваса. После этого регулируй состояние TranslateTransform при помощи полей X и Y, это и будет твой сдвиг.
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Partizan
Дата 24.7.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Anyone, что мешало Canvas кинуть внутрь ScrollViewer-а?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Anyone
Дата 27.7.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(Partizan @  24.7.2009,  20:33 Найти цитируемый пост)
что мешало Canvas кинуть внутрь ScrollViewer-а?

Ничего не мешает, кроме огранченности поля. Практика показывает что больше производительности можно получить, если перемещать содержимое на небольшом канвасе, чем создавать большое поле, которое прокручивается стандартными средствами.  При размерах канваса больше чем 4000х4000 инициализация происхоит очень медленно. Не хочу на ровном месте терять то, что я могу получить почти даром, если немного посижу над кодом.

Цитата(fantast @  24.7.2009,  15:45 Найти цитируемый пост)
передавай его в свойство RenderTransform твоего канваса

Дык при этом смещается сам канвас, а не содержимое (насколько я помню...). 
PM MAIL   Вверх
fantast
Дата 27.7.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Цитата(Anyone @  27.7.2009,  10:16 Найти цитируемый пост)
Дык при этом смещается сам канвас, а не содержимое (насколько я помню...).  

Визуально это будет выглядеть точно также как будто ты будешь двигать все содержимое одновременно. Тоесть твой контрол не побежит вправо или влево, просто его содержимое будет рисоваться со сдвигом. Я когда то делал примерно следующее, когда кликаешь на канвас средней кнопкой мыши и тянешь, то якобы передвигается все содержимое вслед за мышью. Производительность на высоте, потому что даже OnRender не вызывается. Только не забудь поставить ClipToBounds в false, иначе у тебя не будет ничего рисоваться что выходит за мнимые границы канваса.
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Anyone
Дата 29.7.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(fantast @  27.7.2009,  18:48 Найти цитируемый пост)
Только не забудь поставить ClipToBounds в false

Не догадался. 

Но при этом существует несколько проблем.
1. Фон все таки передвигается. Думаю добавить 2 прямоугольника с фоном и сеткой и смещать их.
2. Канвас вылазит все таки на другие контролы и перекрывает их. Нужно выставить z-индекс сооветвующим образом?
PM MAIL   Вверх
fantast
Дата 29.7.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Цитата(Anyone @  29.7.2009,  11:02 Найти цитируемый пост)
1. Фон все таки передвигается. Думаю добавить 2 прямоугольника с фоном и сеткой и смещать их.

Если я правильно понял, то по-моему лучше сделать фон у канваса полностью прозрачным, а твою сетку замостить в контейнере, в котором он храниться, правильно выставив z-индекс.

Цитата(Anyone @  29.7.2009,  11:02 Найти цитируемый пост)
Канвас вылазит все таки на другие контролы и перекрывает их. Нужно выставить z-индекс сооветвующим образом? 


если канвас вылазит, то наверно надо выставить ClipToBounds в true у конейнера в котором он храниться, если вылазит его содержимое - то у содержимого надо выставлять. Если все правильно понял )  
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.