为什么要将附加属性添加到XAML?

为什么要将附加属性添加到XAML?,xaml,Xaml,我看了各种各样的例子,并阅读了有关附加属性的内容。然而,我仍然不清楚为什么需要或更好。看看这个例子: 你好 DockPanel.Dock是一个附加属性,其目的很清楚:不是每个元素都应该拥有或需要一个单独的属性来定义其停靠行为。网格的行和列定义也是如此。但为什么不这样表达呢: 你好 对于具有行和列标记的轴网,也可以使用类似的方式 这是一个纯粹的设计决策,还是有其他原因使附加属性成为更好的或唯一的解决方案?您的示例可能仅适用于一种情况,甚至是常见情况,但您不应仅依赖一个附加属性 例如,假设您

我看了各种各样的例子,并阅读了有关附加属性的内容。然而,我仍然不清楚为什么需要或更好。看看这个例子:

你好

DockPanel.Dock是一个附加属性,其目的很清楚:不是每个元素都应该拥有或需要一个单独的属性来定义其停靠行为。网格的行和列定义也是如此。但为什么不这样表达呢:

你好

对于具有行和列标记的轴网,也可以使用类似的方式


这是一个纯粹的设计决策,还是有其他原因使附加属性成为更好的或唯一的解决方案?

您的示例可能仅适用于一种情况,甚至是常见情况,但您不应仅依赖一个附加属性

例如,假设您希望标记多个附着的属性,如下所示:

<DockPanel>
  <CheckBox DockPanel.Dock="Top" TextBlock.FontSize="16">Hello</CheckBox>
</DockPanel>
<DockPanel>
  <DockPanel.RenderTransform>
    <ScaleTransform ScaleX="2" ScaleY=3" />
  </DockPanel.RenderTransform>
</DockPanel>
这样会有多混乱

我自己会补充另一个观点,尽管这只是我的观点。XAML表示法通常表示对象结构:元素表示类实例,而属性表示属性。您的模式将与如下设置属性的能力相冲突:

<DockPanel>
  <CheckBox DockPanel.Dock="Top" TextBlock.FontSize="16">Hello</CheckBox>
</DockPanel>
<DockPanel>
  <DockPanel.RenderTransform>
    <ScaleTransform ScaleX="2" ScaleY=3" />
  </DockPanel.RenderTransform>
</DockPanel>
这是一种特定的元素模式,表示定义属性的替代方法,例如RenderTransform内容,即实际的转换实例

更新:在您的示例中,我还添加了另一个关于应该作为特定容器的子容器插入的内容,即DockPanel。停靠的应该是一个实际的子容器,或者只是一个虚拟容器,而不是可视化/逻辑树的一部分?那么,假设沿着视觉/逻辑树走,您是否应该找到这个元素?如果不是,您应该以何种方式获取停靠值


现在,我不确定我的答案是否令您满意,但是…请在“附加属性”模式中更好地指定您不喜欢的内容,也许您会达到目的

我喜欢附加属性,你们的例子中的两个不同属性确实解释了它们为什么有用。我完全错过了!我喜欢在没有评论的情况下被否决的问题……如果我不知道问题出在哪里,我怎么可能改进它。