首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OnRender中重绘或刷新?

如何在OnRender中重绘或刷新?
EN

Stack Overflow用户
提问于 2012-05-14 22:14:04
回答 4查看 14.5K关注 0票数 6

我想画一些动态的东西。下面的代码显示了我的OnRender。我在我的程序中需要的地方设置了DrawItem。但是当我调用DrawItem =5;时,我必须调用什么才能调用OnRender呢?

代码语言:javascript
复制
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; }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-14 22:17:39

你的问题不清楚,但据我所知,你似乎在要求一种方法,在更新绘图变量后刷新视觉效果。更新图形变量后,可以使用以下内容:

代码语言:javascript
复制
this.InvalidateVisual();

并具有以下属性:

代码语言:javascript
复制
private int drawItem;
pulic int DrawItem
{
 get {return drawItem;}
 set 
 {
    drawItem=value;
    this.InvalidateVisual();
 }
}
票数 7
EN

Stack Overflow用户

发布于 2017-06-08 12:43:23

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

更新UI的一种更有效的方法是创建一个DrawingGroup“后备存储”,并在OnRender()期间将其添加到DrawingContext。然后,您可以随时更新它,使用DrawingGroup.Open(),WPF将更新您的UI。

如果这听起来令人困惑,请记住WPF是一个保留的绘图系统。这意味着最好将OnRender()称为AccumulateDrawingObjects()。它实际上积累了一个实时绘制对象的树,其中一些对象(如DrawingGroup、RenderTargetBitmap和WriteableBitmap)可以在以后更新。

它看起来是这样的:

代码语言:javascript
复制
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();            
}
票数 16
EN

Stack Overflow用户

发布于 2016-03-09 02:37:17

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

代码语言:javascript
复制
public static readonly DependencyProperty PropertyNameProperty = DependencyProperty.Register("PropertyName", typeof(PropertyType), typeof(PropertyElementType), new FrameworkPropertyMetadata(DefaultPropertyValue, FrameworkPropertyMetadataOptions.AffectsRender));

这里的关键是:

代码语言:javascript
复制
FrameworkPropertyMetadataOptions.AffectsRender

因此,现在可以在XAML中设置该属性,并在更改时自动更新visual。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10585069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档