Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Если дополнительная функциональность, предлагаемая специализированным диспетчером компоновки, не требуется, то можно просто расширить класс
FrameworkElementCustomVisualFrameworkElementУнаследуйте его от
FrameworkElementSystemSystem.WindowsSystem.Windows.InputSystem.Windows.MediaSystem.Windows.Media.ImagingКласс
CustomVisualFrameworkElementVisualCollectionDrawingVisualpublic class CustomVisualFrameworkElement : FrameworkElement{<b> // Коллекция всех визуальных объектов.</b> VisualCollection theVisuals; public CustomVisualFrameworkElement() {<b> // Заполнить коллекцию VisualCollection несколькими объектами DrawingVisual.</b><b> // Аргумент конструктора представляет владельца визуальных объектов.</b> theVisuals = new VisualCollection(this) {AddRect(),AddCircle()}; } private Visual AddCircle() { DrawingVisual drawingVisual = new DrawingVisual();<b> // Получить объект DrawingContext для создания нового содержимого.</b> using DrawingContext drawingContext = drawingVisual.RenderOpen()<b> // Создать круг и нарисовать его в DrawingContext.</b> drawingContext.DrawEllipse(Brushes.DarkBlue, null, new Point(70, 90), 40, 50); return drawingVisual; } private Visual AddRect() { DrawingVisual drawingVisual = new DrawingVisual(); using DrawingContext drawingContext = drawingVisual.RenderOpen() Rect rect = new Rect(new Point(160, 100), new Size(320, 80)); drawingContext.DrawRectangle(Brushes.Tomato, null, rect); return drawingVisual; }}Прежде чем специальный элемент
FrameworkElementWindowGetVisualChild()VisualChildrenCountVisualCollectionprotected override int VisualChildrenCount => theVisuals.Count;protected override Visual GetVisualChild(int index){ // Значение должно быть больше нуля, поэтому разумно это проверить. if (index < 0 || index >= theVisuals.Count) { throw new ArgumentOutOfRangeException(); } return theVisuals[index];}Теперь вы располагаете достаточной функциональностью, чтобы протестировать специальный класс. Модифицируйте описание XAML элемента Window, добавив в существующий контейнер
StackPanelCustomVisualFrameworkElement<Window x:Class="RenderingWithVisuals.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<b> xmlns:local="clr-namespace:RenderingWithVisuals"</b> Title="Fun with the Visual Layer" Height="350" Width="525" Loaded="Window_Loaded" WindowStartupLocation="CenterScreen"> <StackPanel Background="AliceBlue" Name="myStackPanel"> <Image Name="myImage" Height="80"/><b> <local:CustomVisualFrameworkElement/></b> </StackPanel></Window>Результат выполнения программы показан на рис. 26.15.
