Измените свойства локального класса, который опирается на DrawingVisual
Я определил Drawing
класс, который происходит от FrameworkElement
, Я использую это, чтобы нарисовать на DrawingVisual
, В моем XAML
Я включил этот местный класс.
Теперь мой вопрос: как я могу связать свойства этого класса с переменной или как я могу даже изменить их?
Например, скажем, я хочу изменить width
имущество. Я включил Button
на моем XAML
и попытался изменить width
но ничего не происходит
Весь необходимый код ниже:
<Window x:Class="Geom.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:geom="clr-namespace:Geom"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="100"/>
</Grid.RowDefinitions>
<Canvas Width="0" Height="0">
<geom:Drawing x:Name="Drawing" />
</Canvas>
<Button Grid.Row="1" Content="Change" Click="ButtonBase_OnClick"/>
</Grid>
</Window>
public class Drawing : FrameworkElement
{
private readonly VisualCollection _visuals;
public int width { get; set; }
public Drawing()
{
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
_visuals = new VisualCollection(this);
var geometryGroup = new GeometryGroup();
width = 50;
var depth = 50;
var x = 50;
var y = 50;
var rect = new Rect(x, y , width, depth);
var rectGeom = new RectangleGeometry(rect);
geometryGroup.Children.Add(rectGeom);
geometryGroup.Freeze();
var drawingVisual = new DrawingVisual();
using (var dc = drawingVisual.RenderOpen())
{
dc.DrawGeometry(Brushes.Blue, null, geometryGroup);
}
_visuals.Add(drawingVisual);
}
protected override Visual GetVisualChild(int index)
{
return _visuals[0];
}
protected override int VisualChildrenCount
{
get
{
return 1;
}
}
}
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
Drawing.width = 10;
}
}
1 ответ
Решение
Чтобы обновить DrawingVisual, вы должны перерисовать визуал на его DrawingContext с новыми значениями.
Таким образом, если вы установите ширину, вы должны перерисовать визуально в контексте рисования. Измените свой код на это:
public class Drawing : FrameworkElement
{
private readonly VisualCollection _visuals;
private int width;
public int VisualWidth
{
get { return width; }
set
{
width = value;
RefreshDrawing();
}
}
public Drawing()
{
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
_visuals = new VisualCollection(this);
var geometryGroup = new GeometryGroup();
width = 50;
DrawingVisual drawingVisual = new DrawingVisual();
RefreshDrawing(drawingVisual);
_visuals.Add(drawingVisual);
}
private void RefreshDrawing(DrawingVisual drawingVisual = null)
{
var geometryGroup = new GeometryGroup();
var rect = new Rect(50, 50, VisualWidth, 50);
var rectGeom = new RectangleGeometry(rect);
geometryGroup.Children.Add(rectGeom);
geometryGroup.Freeze();
drawingVisual = drawingVisual ?? (DrawingVisual)GetVisualChild(0);
using (var dc = drawingVisual.RenderOpen())
{
dc.DrawGeometry(Brushes.Blue, null, geometryGroup);
}
}
protected override Visual GetVisualChild(int index)
{
return _visuals[0];
}
protected override int VisualChildrenCount
{
get
{
return 1;
}
}
}
Задавать VisualWidth
из обработчика нажатия кнопки:
Drawing.VisualWidth = 10;