【问题标题】:What is the reason for using DependencyProperty.AddOwner method instead of simple POCO property getters/setters on a DependencyObject?在 DependencyObject 上使用 DependencyProperty.AddOwner 方法而不是简单的 POCO 属性 getter/setter 的原因是什么?
【发布时间】:2012-05-25 11:02:05
【问题描述】:

有人可以解释一下,在 WPF 中使用 AddOwner 方法有什么好处(完全依赖属性)?我有一些误解。

例如,看下面的代码。

public class TestVisual: Shape
{
    private LineGeometry line = new LineGeometry();

    public static readonly DependencyProperty XY1Property =
        LineGeometry.StartPointProperty.AddOwner(
            typeof(TestVisual),
            new FrameworkPropertyMetadata(new Point(0,0),
                FrameworkPropertyMetadataOptions.AffectsMeasure));

    public static readonly DependencyProperty XY2Property =
        LineGeometry.EndPointProperty.AddOwner(
            typeof(TestVisual),
            new FrameworkPropertyMetadata(new Point(0, 0),
                FrameworkPropertyMetadataOptions.AffectsMeasure));


    public Point XY1
    {
        get { return (Point)GetValue(XY1Property);}
        set { SetValue(XY1Property,value); }
    }

    public Point XY2
    {
        get { return (Point)GetValue(XY2Property); }
        set { SetValue(XY2Property, value); }
    }


    protected override Geometry DefiningGeometry
    {
        get
        {
            line.StartPoint = XY1 ;
            line.EndPoint = XY2;                         
            return line;
        }
    }
}

从上面的代码可以看出,TestVisual 类使用 AddOwner 方法作为依赖属性。好的,但是同样的结果我们可以变得更容易(我的意思是我们可以得到一个类,它允许通过设置 XY1 和 XY2 点来调整线条视觉元素):

    public class TestVisual: Shape
{
    private LineGeometry line = new LineGeometry();

    public Point XY1
    {
        get;
        set;
    }

    public Point XY2
    {
        get;
        set;
    }


    protected override Geometry DefiningGeometry
    {
        get
        {
            line.StartPoint = XY1 ;
            line.EndPoint = XY2;                         
            return line;
        }
    }
}

那么重点是什么?提前致谢。

【问题讨论】:

    标签: c# wpf dependency-properties


    【解决方案1】:

    重点是XY1XY2 在第一个版本中是依赖属性,而在第二个版本中是简单的.NET 属性。见Why dependency properties?

    通常,AddOwner 用于使依赖属性在最终不是从拥有依赖属性的类型派生的类型上可用。

    【讨论】:

    • 感谢您的澄清和您提供的链接。好的,通常我已经理解 AddOwner 是什么意思,但在某些情况下,我可以通过使用委托或反射来替换它。在我看来,AddOwner 只是节省内存资源,将属性变量保存在存储中。可能有人给我提供了一个展示 AddOwner 优势的示例?
    猜你喜欢
    • 2016-08-04
    • 2011-02-07
    • 2011-10-05
    • 2010-09-09
    • 2011-09-06
    • 2015-10-28
    相关资源
    最近更新 更多