代码之家  ›  专栏  ›  技术社区  ›  OwenP

是否可以从无关类中“借用”依赖属性?

  •  4
  • OwenP  · 技术社区  · 16 年前

    我正在编写一个类,它在WPF中呈现一些内容,我想让用户控制如何呈现内容。渲染主要是删除线条,因此我决定查看System.Windows.Forms.Shapes.Line类,了解可能要实现的属性。这使我实现了 StrokeXXXX 属性,因为每个属性都需要元数据来影响渲染,所以这是一项繁重的工作。

    一位同事建议我从这样的形状“借用”属性:

    Shape.StrokeThicknessProperty.AddOwner(typeof(MyType));
    

    这似乎是个不错的主意。我认为通过这样做,我将失去设置强制和属性更改回调的能力,但看起来采用propertymetadata的重载允许这样做。我能看到的唯一缺点是,如果形状的实现发生更改,它将影响我们的类,但是我不确定.NET接口的更改频率。

    你怎么认为?当一个著名的类具有您想要的行为和一个稳定的接口时,这是定义属性的一个很好的快捷方式,还是一个在汽油浴中玩火的可靠方法?

    2 回复  |  直到 16 年前
        1
  •  4
  •   rudigrobler    16 年前

    借用DPS是非常安全和有用的。阅读 following 由WPF博士发表关于这个主题的文章!

    以下是他提供的一些“提示:

    • 您应该始终知道所有者类对您所借的任何属性做了什么。
    • 您应该注意默认值和继承。有时需要一个默认值为true的bool属性…其他时候,您可能需要默认值false。有时您需要继承的属性…有时你明确不想要继承。(借用textfelement.fontsize之类的属性可能会使树中较低的部分出错。)
    • owner类有时可能会定义一个PropertyChangedCallback,它会干扰您根据需要使用该属性的能力。始终知道所有者类对属性做了什么。
    • owner类可以为属性提供一个验证例程,阻止您输入要指定的值。同样,始终知道所有者类对属性做了什么。 属性的注册方式可能会使它的性能变得昂贵,例如FixedPage.Bottom,它会使父级的排列在对象上的任何时候都失效。有时你可能明确地想要这种行为…其他时候,它只会不必要地导致布局通过。同样,始终知道所有者类对属性做了什么。
    • 如果在框架本身试图使用属性的场景中使用属性(如itemscontrol上的textsearch.textpath),则可能会发现自己与框架发生冲突。
        2
  •  1
  •   Ed Ball    16 年前

    我个人会一直创建自己的依赖属性。这真的不是什么额外的工作,而且你不必担心任何可能的警告。