Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Если дополнительная функциональность, предлагаемая специализированным диспетчером компоновки, не требуется, то можно просто расширить класс
FrameworkElement
CustomVisualFrameworkElement
Унаследуйте его от
FrameworkElement
System
System.Windows
System.Windows.Input
System.Windows.Media
System.Windows.Media.Imaging
Класс
CustomVisualFrameworkElement
VisualCollection
DrawingVisual
public 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;
}
}
Прежде чем специальный элемент
FrameworkElement
Window
GetVisualChild()
VisualChildrenCount
VisualCollection
protected 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, добавив в существующий контейнер
StackPanel
CustomVisualFrameworkElement
<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.
