2012-05-14 58 views
3

我想动态绘制一些东西。以下代码显示了我的OnRender。我在我的程序中某处设置了DrawItem,我需要它。但是当我打电话给DrawItem =5;时,我需要打电话给OnRender才能打电话?如何在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; } 
+2

重绘* *是什么? – Will

+0

@将“新”绘制项目 – David

回答

5

你的问题并不清楚,但从我能理解你似乎要求更新绘图变量后刷新视觉效果的方法。你可以更新您的绘图变量之后使用以下:

this.InvalidateVisual(); 

,并与物业:

private int drawItem; 
pulic int DrawItem 
{ 
get {return drawItem;} 
set 
{ 
    drawItem=value; 
    this.InvalidateVisual(); 
} 
} 
+0

我可以从任何地方调用这个吗? – David

+0

从实现OnDraw的组件内部。对于重绘另一个组件,它将是<组件对象> .InvalidateVisual() – Indy9000

+0

如果控件更改大小并需要更改布局,则只需使用InvalidateVisual(),因为它会触发相当昂贵的重新布局。如果您的控件尺寸相同,请参阅有关DrawingGroup的答案。 –

1

http://msdn.microsoft.com/de-de/library/ms598919(v=vs.100).aspx

你必须调用InvalidateVisual为应更新的控制。但是,正如你所看到的,对InvalidateVisual的调用会导致完整的布局周期,所以请确保出于性能原因您的画布或任何想要绘制的内容不包含或仅包含少数子元素。

0

我遇到了类似的问题,并找到了一个更优雅的解决方案。定义一个DependencyProperty像这样:

public static readonly DependencyProperty PropertyNameProperty = DependencyProperty.Register("PropertyName", typeof(PropertyType), typeof(PropertyElementType), new FrameworkPropertyMetadata(DefaultPropertyValue, FrameworkPropertyMetadataOptions.AffectsRender)); 

这里的关键是:

FrameworkPropertyMetadataOptions.AffectsRender 

所以,现在的属性可以在XAML设置和更新不断变化的自动可视化。

5

如果您的控件大小发生变化,您可以使用InvalidateVisual(),但请记住这会导致您的UI重新布局相当昂贵。如果您的控件尺寸保持不变,则不应致电InvalidateVisual()

更新用户界面的更有效方法是在OnRender()期间创建DrawingGroup“后备存储”并将其添加到DrawingContext。然后,您可以随时使用DrawingGroup.Open()对其进行更新,WPF将更新您的用户界面。

如果这听起来令人困惑,请记住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();    
} 
相关问题