Dav*_*vid 5 c# wpf drawing onrender
我想动态画一些东西.以下代码显示了我的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; }
Run Code Online (Sandbox Code Playgroud)
如果控件的大小发生变化,您可以使用InvalidateVisual(),但请记住,这会导致相当昂贵的UI重新布局.如果你的控件的大小保持不变,你不应该打电话InvalidateVisual().
更新UI的更有效方法是创建DrawingGroup"后备存储"并将其添加到DrawingContext期间OnRender().然后,您可以随时更新它,使用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();
}
Run Code Online (Sandbox Code Playgroud)
您的问题不明确,但根据我的理解,您似乎要求在更新绘图变量后刷新视觉效果的方法.更新绘图变量后,可以使用以下内容:
this.InvalidateVisual();
Run Code Online (Sandbox Code Playgroud)
和财产:
private int drawItem;
pulic int DrawItem
{
get {return drawItem;}
set
{
drawItem=value;
this.InvalidateVisual();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11120 次 |
| 最近记录: |