我想画一些动态的东西。下面的代码显示了我的OnRender。我在我的程序中需要的地方设置了DrawItem。但是当我调用DrawItem =5;时,我必须调用什么才能调用OnRender呢?
protected override void OnRender(DrawingContext drawingContext)
{
switch (DrawItem)
{
case 1:
//Draw Item
break;
case 2:
//Draw Item
break;
case 3:
//Draw Item
break;
case 4:
//Draw Item
break;
case 5:
//Draw Item
break;
}
base.OnRender(drawingContext)
}
public int DrawItem { get; set; }发布于 2012-05-14 22:17:39
你的问题不清楚,但据我所知,你似乎在要求一种方法,在更新绘图变量后刷新视觉效果。更新图形变量后,可以使用以下内容:
this.InvalidateVisual();并具有以下属性:
private int drawItem;
pulic int DrawItem
{
get {return drawItem;}
set
{
drawItem=value;
this.InvalidateVisual();
}
}发布于 2017-06-08 12:43:23
如果控件的大小发生变化,您可以使用InvalidateVisual(),但是请记住,这会导致相当昂贵的UI重新布局。如果控件的大小保持不变,则不应该调用InvalidateVisual()。
更新UI的一种更有效的方法是创建一个DrawingGroup“后备存储”,并在OnRender()期间将其添加到DrawingContext。然后,您可以随时更新它,使用DrawingGroup.Open(),WPF将更新您的UI。
如果这听起来令人困惑,请记住WPF是一个保留的绘图系统。这意味着最好将OnRender()称为AccumulateDrawingObjects()。它实际上积累了一个实时绘制对象的树,其中一些对象(如DrawingGroup、RenderTargetBitmap和WriteableBitmap)可以在以后更新。
它看起来是这样的:
DrawingGroup backingStore = new DrawingGroup();
protected override void OnRender(DrawingContext drawingContext) {
base.OnRender(drawingContext);
Render(); // put content into our backingStore
drawingContext.DrawDrawing(backingStore);
}
// I can call this anytime, and it'll update my visual drawing
// without ever triggering layout or OnRender()
private void Render() {
var drawingContext = backingStore.Open();
Render(drawingContext);
drawingContext.Close();
}发布于 2016-03-09 02:37:17
我遇到了类似的问题,并找到了一个更优雅的解决方案。像这样定义一个DependencyProperty:
public static readonly DependencyProperty PropertyNameProperty = DependencyProperty.Register("PropertyName", typeof(PropertyType), typeof(PropertyElementType), new FrameworkPropertyMetadata(DefaultPropertyValue, FrameworkPropertyMetadataOptions.AffectsRender));这里的关键是:
FrameworkPropertyMetadataOptions.AffectsRender因此,现在可以在XAML中设置该属性,并在更改时自动更新visual。
https://stackoverflow.com/questions/10585069
复制相似问题