首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF OnRender不工作

WPF OnRender不工作
EN

Stack Overflow用户
提问于 2015-01-20 10:00:56
回答 2查看 979关注 0票数 0

我编写了一个控件,它从FrameworkElement派生一个类并覆盖它的OnRender方法。在这个方法内部,有一个DrawLine动画,它通过向drawingContext.DrawLine方法提供一个AnimationClock实例来实现。

如果只有几行,它工作得很好,如果有数百行,它就不能工作了。AffectsRender和InvalideVisual()方法也不起作用,它不能调用OnRender方法。如果有中等数量的行数,它就不能工作,但如果我调整窗口大小,它就能工作!我发现,如果我同时更改DependencyProperty (具有AffectsRender标志)并添加一个新的视觉元素,则无论窗口中有多少行,它都可以正常工作。

我查阅了一些文章,说WPF是一个保留的图形,OnRender方法是由WPF本身调用的。是WPF决定何时需要调用OnRender。我怎么做才能告诉WPF调用OnRender?

代码如下:

代码语言:javascript
复制
class PipeLine:FrameworkElement
{                
    static PipeLine()
    {    
        SignalInputProperty = DependencyProperty.Register("SignalInput", typeof(int), typeof(PipeLine),
            new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.AffectsRender));
        SignalOutputProperty = DependencyProperty.Register("SignalOutput", typeof(bool), typeof(PipeLine),
            new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));            
    }       

    public static readonly DependencyProperty SignalInputProperty;
    public int SignalInput
    {
        get { return (int)GetValue(SignalInputProperty); }
        set
        {
            SetValue(SignalInputProperty, value);
        }
    }

    public static readonly DependencyProperty SignalOutputProperty;
    public bool SignalOutput
    {
        get { return (bool)GetValue(SignalOutputProperty); }
        set { SetValue(SignalOutputProperty, value); }
    }


    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        Point startPH = new Point(0, ActualHeight / 2);
        Point endPH = new Point(ActualWidth, ActualHeight / 2);


        Point startPH1 = new Point(-this.ActualHeight / 2, this.ActualHeight / 2);
        Point endPH1 = new Point(this.ActualWidth + this.ActualHeight / 2, this.ActualHeight / 2);


        PointAnimation animation = new PointAnimation();
        animation.From = startPH;
        animation.To = endPH;
        animation.Duration = new Duration(TimeSpan.FromSeconds(2.0));
        AnimationClock clock = animation.CreateClock();

        Pen pen1 = new Pen(Brushes.DarkGray, ActualHeight);
        Pen pen2 = new Pen(Brushes.LightSkyBlue, ActualHeight);

        if (SignalInput == 2  && !SignalOutput)
        {
            drawingContext.DrawLine(pen1, startPH, endPH);
            drawingContext.DrawLine(pen2, startPH, null, endPH, clock);
        }
        else 
        {
            drawingContext.DrawLine(pen1, startPH, endPH);
            SignalOutput = false;
        }
    }

    void clock_Completed(object sender, EventArgs e)
    {
        this.SignalOutput = true;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-01-20 15:37:37

在WPF中,当发生排列或测量时,将调用OnRender方法。所以我猜这就是你问题的第二部分的答案。

票数 0
EN

Stack Overflow用户

发布于 2015-01-20 19:08:02

问题是SignalOutput的值不会改变。它在第一次勾选时就是真的。然后它就会一次又一次成为现实。

如果为OldValue == NewValue,则不会更新依赖属性。

因此,DP不会影响渲染,因为它本身不受影响。

代码语言:javascript
复制
void clock_Completed(object sender, EventArgs e)
{
    this.InvalidateVisual();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28036606

复制
相关文章

相似问题

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