Язык программирования C#9 и платформа .NET5
Часть 534 из 642 Информация о книге
Loaded="MainWindow_Loaded">Замените элемент
панельюGridи добавьте в нее элементStackPanel:Image<StackPanel Background="AliceBlue" Name="myStackPanel"><Image Name="myImage" Height="80"/></StackPanel>Элемент управления
пока не имеет значения в свойствеImage, т.к. оно будет устанавливаться во время выполнения. С событиемSourceсвязана работа по построению графических данных в памяти с применением объектаLoaded. Удостоверьтесь в том, что файлDrawingBrushсодержит операторы using для следующих пространств имен:MainWindow.csusing System;using System.Windows;using System.Windows.Media;using System.Windows.Media.Imaging;Вот реализация обработчика события
:Loadedprivate void MainWindow_Loaded(object sender, RoutedEventArgs e){const int TextFontSize = 30;<b> // Создать объект System.Windows.Media.FormattedText.</b>FormattedText text = new FormattedText("Hello Visual Layer!",new System.Globalization.CultureInfo("en-us"),FlowDirection.LeftToRight,new Typeface(this.FontFamily, FontStyles.Italic,FontWeights.DemiBold, FontStretches.UltraExpanded),TextFontSize,Brushes.Green,null,VisualTreeHelper.GetDpi(this).PixelsPerDip);<b> // Создать объект DrawingVisual и получить объект DrawingContext.</b>DrawingVisual drawingVisual = new DrawingVisual();using(DrawingContext drawingContext =drawingVisual.RenderOpen()){<b> // Вызвать любой из методов DrawingContext для визуализации данных.</b>drawingContext.DrawRoundedRectangle(Brushes.Yellow, new Pen(Brushes.Black, 5),new Rect(5, 5, 450, 100), 20, 20);drawingContext.DrawText(text, new Point(20, 20));}<b> // Динамически создать битовое изображение,</b><b> // используя данные в объекте DrawingVisual.</b>RenderTargetBitmap bmp = new RenderTargetBitmap(500, 100, 100, 90, PixelFormats.Pbgra32);bmp.Render(drawingVisual);<b> // Установить источник для элемента управления Image.</b>myImage.Source = bmp;}В коде задействовано несколько новых классов WPF, которые будут кратко описаны ниже. Метод начинается с создания нового объекта
, который представляет текстовую часть конструируемого изображения в памяти. Как видите, конструктор позволяет указывать многочисленные атрибуты, в том числе размер шрифта, семейство шрифтов, цвет переднего плана и сам текст.FormattedTextЗатем через вызов метода
на экземпляреRenderOpen()получается необходимый объектDrawingVisual. Здесь вDrawingContextвизуализируется цветной прямоугольник со скругленными углами, за которым следует форматированный текст. В обоих случаях графические данные помещаются вDrawingVisualс применением жестко закодированных значений, что не слишком хорошо в производственном приложении, но вполне подходит для такого простого теста.DrawingVisualНесколько последних операторов отображают
на объектDrawingVisual, который является членом пространства именRenderTagetBitmap. Этот класс принимает визуальный объект и трансформирует его в растровое изображение, находящееся в памяти. Затем устанавливается свойствоSystem.Windows.Media.Imagingэлемента управленияSourceи получается вывод, показанный на рис. 26.14.ImageНа заметку! Пространство имен
содержит дополнительные классы кодирования, которые позволяют сохранять находящийся в памяти объектSystem.Windows.Media.Imagingв физический файл в разнообразных форматах. Детали ищите в описанииRenderTargetBitmapи связанных с ним классов.JpegBitmapEncoderВизуализация графических данных в специальном диспетчере компоновки
Хотя применение
для рисования на фоне элемента управления WPF представляет интерес, возможно чаще придется строить специальный диспетчер компоновки (DrawingVisual,Grid,StackPanelи т.д.), который внутренне использует визуальный уровень для визуализации своего содержимого. После создания такого специального диспетчера компоновки его можно подключить к обычному элементуCanvas(а такжеWindowилиPage) и позволить части пользовательского интерфейса использовать высоко оптимизированный агент визуализации, в то время как для визуализации некритичных графических данных будут применяться фигуры и рисунки.UserControl
