Заглянув в окно Document Outline, вы заметите, что каждая часть изображения представлена как XAML-элемент Path
. Если изменить размеры элемента Window
, то качество изображения останется тем же самым безотносительно к тому, насколько большим сделано окно. Причина в том, что изображения, представленные с помощью элементов Path
, визуализируются с применением механизма рисования и математики, а не за счет манипулирования пикселями.
Взаимодействие с изображением
Вспомните, что маршрутизируемое событие распространяется туннельным и пузырьковым образом, поэтому щелчок на любом элементе Path
внутри Canvas
может быть обработан обработчиком событий щелчка на Canvas
. Модифицируйте разметку Canvas
следующим образом:
Добавьте обработчик событий с таким кодом:
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.OriginalSource is Path p)
{
p.Fill = new SolidColorBrush(Colors.Red);
}
}
Запустите приложение и щелкните на линиях, чтобы увидеть эффекты.
Теперь вы понимаете процесс генерации данных путей для сложной графики и знаете, как взаимодействовать с графическими данными в коде. Вы наверняка согласитесь, что наличие у профессиональных художников возможности генерировать сложные графические данные и экспортировать их в виде разметки XAML исключительно важна. После того как графические данные сохранены в файле XAML, разработчики могут импортировать разметку иписать код для взаимодействия с объектной моделью.
Визуализация графических данных с использованием визуального уровня
Последний вариант визуализации графических данных с помощью WPF называется
Далее будет построена небольшая программа, иллюстрирующая основы использования визуального уровня.
Базовый класс Visual и производные дочерние классы
Абстрактный класс System.Windows.Media.Visual
предлагает минимальный набор служб (визуализацию, проверку попадания, трансформации) для визуализации графики, но не предоставляет поддержку дополнительных невизуальных служб, которые могут приводить к разбуханию кода (события ввода, службы компоновки, стили и привязка данных). Класс Visual
является абстрактным базовым классом. Для выполнения действительных операций визуализации должен применяться один из его производных классов. В WPF определено несколько подклассов Visual, в том числе DrawingVisual
, Viewport3DVisual
и ContainerVisual
.
Рассматриваемый ниже пример сосредоточен только на DrawingVisual
— легковесном классе рисования, который используется для визуализации фигур, изображений или текста.
Первый взгляд на класс DrawingVisual
Чтобы визуализировать данные на поверхности с применением класса DrawingVisual
, понадобится выполнить следующие основные шаги:
• получить объект DrawingContext
из DrawingVisual
;
• использовать объект DrawingContext
для визуализации графических данных.
Эти два шага представляют абсолютный минимум, необходимый для визуализации каких-то данных на поверхности. Тем не менее, когда нужно, чтобы визуализируемые графические данные реагировали на вычисления при проверке попадания (что важно для добавления взаимодействия с пользователем), потребуется также выполнить дополнительные шаги:
• обновить логическое и визуальное деревья, поддерживаемые контейнером, на котором производится визуализация;
• переопределить два виртуальных метода из класса FrameworkElement
, позволив контейнеру получать созданные визуальные данные.