强制DrawingVisual重新绘制



我正试图使用DrawingVisual类绘制一个随机的方形;New Square";用新生成的正方形替换正方形的按钮。

我不知道如何强制DrawingVisual重新绘制。

我不是在寻找替代解决方案,我只是想知道是否有可能在实例化后更改DrawingVisual

这是我当前的代码:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<local:RandomSquare Grid.Column="0" x:Name="randomSqare"/>
<Button Grid.Column="1" Content="New Square..." Click="Button_Click"/>
</Grid>

这是我尝试InvalidateVisual方法

public partial class SquareWindow : Window
{
public SquareWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
randomSqare.InvalidateVisual();
}
}
public  class RandomSquare : UIElement
{
private DrawingVisual _visual;
public RandomSquare()
{
_visual = GetRandomSquare();
}
private DrawingVisual GetRandomSquare()
{
Random rnd = new Random();
int xy = rnd.Next(200);
int size = rnd.Next(200);
DrawingVisual visual = new DrawingVisual();
using (DrawingContext context = visual.RenderOpen())
{
context.DrawRectangle(Brushes.AliceBlue, new Pen(Brushes.DarkBlue, 1), new Rect(xy, xy, size, size));
}
return visual;
}
protected override int VisualChildrenCount => 1;
protected override Visual GetVisualChild(int index)
{
return _visual;
}
}

感谢

它不工作,因为

randomSqare.InvalidateVisual();

不会神奇地调用CCD_ 1方法。

该方法在创建RandomSquare元素时仅调用一次,即在Window构造函数中的InitializeComponent()调用期间。


您可以转而绘制传递给重写的OnRender方法的DrawingContext:

public class RandomSquare : UIElement
{
private readonly Random random = new Random();
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
int xy = random.Next(200);
int size = random.Next(200);
drawingContext.DrawRectangle(
Brushes.AliceBlue,
new Pen(Brushes.DarkBlue, 1),
new Rect(xy, xy, size, size));
}
}

当您想要使用DrawingVisual时,您需要在其UIElement父级中调用AddVisualChild。您还必须声明一个显式方法来更新DrawingVisual。

public class RandomSquare : UIElement
{
private readonly DrawingVisual visual = new DrawingVisual();
private readonly Random random = new Random();
public RandomSquare()
{
AddVisualChild(visual);
}
protected override int VisualChildrenCount => 1;
protected override Visual GetVisualChild(int index) => visual;
public void Update()
{
int xy = random.Next(200);
int size = random.Next(200);
using (var drawingContext = visual.RenderOpen())
{
drawingContext.DrawRectangle(
Brushes.AliceBlue,
new Pen(Brushes.DarkBlue, 1),
new Rect(xy, xy, size, size));
}
}
}

最新更新