Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
xmlns:local="clr-namespace:InteractiveLaserSign"
mc:Ignorable="d"
Title="MainWindow" Height="600" Width="650">
<Canvas>
</Canvas>
</Window>
Скопируйте полную разметку XAML из файла
1.fpage
FixedPage
Canvas
MainWindow
Заглянув в окно Document Outline, вы заметите, что каждая часть изображения представлена как XAML-элемент
Path
Window
Path
Взаимодействие с изображением
Вспомните, что маршрутизируемое событие распространяется туннельным и пузырьковым образом, поэтому щелчок на любом элементе
Path
Canvas
Canvas
Canvas
<Canvas MouseLeftButtonDown="Canvas_MouseLeftButtonDown">
Добавьте обработчик событий с таким кодом:
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.OriginalSource is Path p)
{
p.Fill = new SolidColorBrush(Colors.Red);
}
}
Запустите приложение и щелкните на линиях, чтобы увидеть эффекты.
Теперь вы понимаете процесс генерации данных путей для сложной графики и знаете, как взаимодействовать с графическими данными в коде. Вы наверняка согласитесь, что наличие у профессиональных художников возможности генерировать сложные графические данные и экспортировать их в виде разметки XAML исключительно важна. После того как графические данные сохранены в файле XAML, разработчики могут импортировать разметку иписать код для взаимодействия с объектной моделью.
Визуализация графических данных с использованием визуального уровня
Последний вариант визуализации графических данных с помощью WPF называется визуальным уровнем. Ранее уже упоминалось, что доступ к нему возможен только из кода (он не дружественен по отношению к разметке XAML). Несмотря на то что подавляющее большинство приложений WPF будут хорошо работать с применением фигур, рисунков и геометрических объектов, визуальный уровень обеспечивает самый быстрый способ визуализации крупных объемов графических данных. Визуальный уровень также может быть полезен, когда необходимо визуализировать единственное изображение в крупной области. Например, если требуется заполнить фон окна простым статическим изображением, тогда визуальный уровень будет наиболее быстрым способом решения такой задачи. Кроме того, он удобен, когда нужно очень быстро менять фон окна в зависимости от ввода пользователя или чего-нибудь еще.
Далее будет построена небольшая программа, иллюстрирующая основы использования визуального уровня.
Базовый класс Visual и производные дочерние классы
Абстрактный класс
System.Windows.Media.Visual
Visual
DrawingVisual
Viewport3DVisual
ContainerVisual
Рассматриваемый ниже пример сосредоточен только на
DrawingVisual
Первый взгляд на класс DrawingVisual
Чтобы визуализировать данные на поверхности с применением класса
DrawingVisual
• получить объект
DrawingContext
DrawingVisual
• использовать объект
DrawingContext
Эти два шага представляют абсолютный минимум, необходимый для визуализации каких-то данных на поверхности. Тем не менее, когда нужно, чтобы визуализируемые графические данные реагировали на вычисления при проверке попадания (что важно для добавления взаимодействия с пользователем), потребуется также выполнить дополнительные шаги:
• обновить логическое и визуальное деревья, поддерживаемые контейнером, на котором производится визуализация;
• переопределить два виртуальных метода из класса
FrameworkElement
Давайте исследуем последние два шага более подробно. Чтобы продемонстрировать применение класса
DrawingVisual
RenderingWithVisuals
DrawingVisual
Image
Loaded
<Window x:Class="RenderingWithVisuals.MainWindow"
<!--omitted for brevity -->
Title="Fun With Visual Layer" Height="450" Width="800"