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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тривиальная ли задача для WPF? Создание 2D редактора 
:(
    Опции темы
Anyone
Дата 9.7.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мне нужно создать 2D редактор, в котором можно добавлять различные объекты, которые соединяются линиями. При перемещении объектов линия должна изменять свое положение, так чтоб не терялось соединение. Тривиальна ли это задача для WPF? Планирую использовать класс Visual для их прорисовки.
PM MAIL   Вверх
Partizan
Дата 9.7.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


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

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



Anyone, думаю, что соединение двух объектов линией уж точно тривиально...а возможно на codeproject что-то такое уже есть...по крайней мере у меня чёткое ощущение, что я видел что-то такое там...


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


Бывалый
*


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

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



К сожалению, на codeproject ничего подобного я не нашел...
PM MAIL   Вверх
Anyone
Дата 13.7.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да, действительно, задача тривиальная для WPF, более того производительность и функциональность намного выше чем графика с OpenGL.
Написал простейший редакор, который позволяет нарисовать объекты и манипулировать ими.
Но у меня возникло ряд вопросов, буду очень благодарный за ответ.
Для начала немного опишу реализацию, чтобы вопросы были понятными.
Создал класс, производный от Canvas, в котором хранятся объекты:
Код

    public class FbdVisual : Canvas
    {
        private List<Visual> visuals = new List<Visual>();
 
        protected override int VisualChildrenCount
        {
            get
            {
                return visuals.Count;
            }
        }
        protected override Visual GetVisualChild(int index)
        {
            return visuals[index];
        }
        public void AddVisual(Visual visual)
        {
            visuals.Add(visual);
            base.AddVisualChild(visual);
            base.AddLogicalChild(visual);
        }
        public void DeleteVisual(Visual visual)
        {
            visuals.Remove(visual);
            base.RemoveVisualChild(visual);
            base.RemoveLogicalChild(visual);
        }
...

В окне разместил этот контрол так:
Код

         <ScrollBar Grid.Row="2" Grid.Column="0" Orientation="Horizontal"  Minimum="50" Maximum="200" Value="100" SmallChange="10" ValueChanged="ScrollBar_ValueChanged"/>
        <ScrollBar Grid.Row="1" Grid.Column="3"   HorizontalAlignment="Right" Name="scrollBar1" ValueChanged="scrollBar1_ValueChanged" Minimum="0" Maximum="10000" Value="0" SmallChange="10"/>
        <ScrollBar Grid.Row="2" Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Bottom"  Name="scrollBar2" ValueChanged="scrollBar2_ValueChanged" Minimum="0" Maximum="10000" Value="0" SmallChange="10"/>
           <local:FbdVisual Grid.Row="1" Grid.Column="2" x:Name="graph"  ClipToBounds="True" 
                             MouseLeftButtonDown="graph_MouseLeftButtonDown" MouseLeftButtonUp="graph_MouseLeftButtonUp" MouseMove="graph_MouseMove" SizeChanged="graph_SizeChanged"/> 

Первый скроллбар - изменение масштаба, остальные - соответсвенно вертикальная и горизонтальная прокрутки.
Масштаб изменяю так:
Код

graph.LayoutTransform = new ScaleTransform(Value,Value);

Перемещение с помощью скроллов:
Код

                List<Visual> visuals = graph.GetAllVisuals();
                foreach (var vsl in visuals)
                {
                    var visual = vsl as DrawingVisual;
                    if (visual == null) continue;
                    if (visual.GetValue(NameProperty).ToString()=="Grid")
                    {
                        visual.Transform = new TranslateTransform(dx%gridX, dy%gridY);                        
                    }
                    else
                    {
                        visual.Transform = new TranslateTransform(dx, dy);
                    }
                }

А теперь, я надеюсь не сильно вас утомил, и задам свои вопросы:
1. Можно ли как то изменить z-порядок перемещаемых визуальных объектов, чтобы они были всегда сверху?
2. Может быть есть более правильная реализация изменение масштаба и прокрутки?
3. Как применить несколько видов трансформации, к примеру и TranslateTransform и ScaleTransform одновременно?
4. Возможно ли координаты одного объекта (родителя) привязать к координатам другого (детей) так, что при трансформации родителя, трансформация детей происходила автоматически? Это необходимо для того, чтобы можно было поверху объекта нарисовать элементы, которые по своему будут реагировать на события. Или может быть есть более удачное решение?
5. Как сделать невидимые объекты, которые будут реагировать на события? Добавить только в логическое дерево и не добавлять в визуальное?
6. Может быть правильнее было бы использовать VisualCollection вместо списка типа Visual?
Спасибо за внимание.
PM MAIL   Вверх
Anyone
Дата 13.7.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нашел интересный примерчик.
Вопросы 1 и 3 отпадают, но появился еще один:
7. Появилась идея перемещать объекты посредством трансформации а не перерисовки объекта, является ли это хорошим решением для увеличения производительности?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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