WPF: как создавать сложные пользовательские элементы управления? (как GDI +) - PullRequest
3 голосов
/ 18 декабря 2010

Например, допустим, я хочу создать что-то сложное.как масштабируемый / панорамируемый график.как карты Google, или график фондового рынка, или что-то в этом роде.

XAML, и вся эта иерархия на самом деле не работает.То, что я пытаюсь сделать, это больше похоже на то, что было в прошлом с GDI + / Winforms.Где я мог переопределить рисование, т. Е. «Защищенное переопределение void OnPaint (PaintEventArgs e)», а затем я бы нарисовал все, что хотел.Где бы я делал двойную буферизацию.Как нарисовать в буфер и перетащить его на экран.

Но как мне это сделать в WPF?

Ответы [ 3 ]

2 голосов
/ 18 декабря 2010

Принципиальная разница между WPF и GDI / GDI + / WinForms заключается в том, что WPF использует режим удержания рендеринга (в отличие от прямого рендеринга GDI). Короче говоря, это означает, что система (фактически, аппаратная часть) позаботится о двойной буферизации для вас. Вместо процедурного рисования на экране / буфере, вы скорее декларативно предоставляете дерево векторных объектов и оставляете весь рендеринг в WPF.

Векторные объекты бывают разных уровней сложности / абстракции - самые низкоуровневые, с которыми вы когда-либо захотите иметь дело, это Visuals. Упомянутые Дэвидом фигуры (эллипс, прямоугольник и т. Д.) Уже являются объектами более высокого уровня, которые также могут обрабатывать взаимодействие с пользователем, например тестирование попаданий и т. Д.

1 голос
/ 18 декабря 2010

Вы можете использовать любую из форм WPF, например Эллипс , Прямоугольник , а затем с помощью класса Canvas вы можете перемещать их:

var rect = new Rectangle();
//...set width, height...
Canvas.SetTop(rect, 10);
Canvas.SetLeft(rect, 15);

Это должно помочь вам начать. Имейте в виду, что масштабирование, растяжение контента, перемещение и вращение могут быть достигнуты с помощью математических функций, но не паникуйте! В WPF тоже есть некоторые мелочи:

var rotateTransform1 = new RotateTransform(45);
rect.RenderTransform = rotateTransform1;
0 голосов
/ 18 декабря 2010

Если вы действительно, действительно этого хотите, вы можете получить свой контроль из UIElement или FrameworkElement и переопределить OnRender , где вы получите объект DrawingContext, который предоставляет методы рисования фигур, текста, изображений.

Но если вы хотите работать в соответствии с философией и духом WPF, вероятно, в 99% случаев вам не нужно переопределять OnRender. WPF предлагает множество (и я действительно имею в виду много) способов разработки новых элементов управления с помощью стилей, шаблонов и, если эти два не выполняют свою работу, а затем создает подклассы соответствующего элемента управления в иерархии элементов управления WPF.

Как уже указывал gstercken, WPF - это не WinForms, вы должны подумать о WPF, чтобы хорошо поработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...