我正在编写一个在 WPF 中呈现某些内容的类,并且我想让用户控制内容的呈现方式。渲染主要是抚摸线条,因此我决定查看 System.Windows.Forms.Shapes.Line 类以了解我可能想要实现哪些属性。这导致我实现了大部分 StrokeXXXX 属性,这是一项繁重的工作,因为每个属性都需要元数据来影响渲染。

一位同事建议我从 Shape 中“借用”属性,如下所示:

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

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

你怎么认为?当一个众所周知的类具有您想要的行为和稳定的接口时,这是定义属性的一个不错的捷径,还是在汽油浴中玩火的可靠方法?

有帮助吗?

解决方案

借用DP是非常安全又有用的...阅读 下列的 WPF 博士关于该主题的帖子!

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

  • 您应该始终了解所有者类别如何处理您借用的任何财产。
  • 您应该注意默认值和继承。有时您需要一个默认值为 true 的 bool 属性...有时您可能需要默认值 false。有时您需要继承的财产...其他时候你明确地不想要继承。(借用像 TextElement.FontSize 这样的属性确实可能会搞砸树中较低的部分。)
  • 所有者类有时可能会定义一个 PropertyChangedCallback,这会干扰您按照自己的意愿使用该属性的能力。始终了解所有者阶层对财产的用途。
  • 所有者类可能会为属性提供验证例程,以阻止您输入要指定的值。再次强调,始终了解所有者类别对财产的用途。属性的注册方式可能会导致性能成本高昂,例如FixedPage.Bottom,只要对象上的属性发生更改,它就会使父级的安排无效。有时您可能明确想要这种行为......其他时候,它只会不必要地导致布局传递。再次强调,始终了解所有者类别对财产的用途。
  • 如果您在框架本身尝试使用该属性的场景中使用该属性(例如 ItemsControl 上的 TextSearch.TextPath),您很可能会发现自己与框架发生争用。

其他提示

我只是继续创建自己的依赖属性。这真的不是多余的工作,然后你不必担心任何可能的警告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top