【发布时间】:2017-04-22 18:23:10
【问题描述】:
我希望我的一些 Button、ToggleButton 和 RadioButton 具有 Geometry 属性,以便我可以在 ControlTemplates 中使用以避免在将特定于实例的几何图形分配给这些控件时避免样板。
例如,目前我可以这样写:
<my:GeometryButton Geometry="{StaticResource OneGeometry}"/>
<my:GeometryButton Geometry="{StaticResource OtherGeometry}"/>
<!-- ...and inside the Style for GeometryButton: -->
<ContentControl TargetType="{x:Type my:GeometryButton}">
<Border>
<Path Data={TemplateBinding Geometry}/>
</Border>
</ContentControl>
使用这个 GeometryButton 类:
public class GeometryButton : Button
{
static GeometryButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(GeometryButton),
new FrameworkPropertyMetadata(typeof(GeometryButton)));
}
public Geometry Geometry
{
get { return (Geometry)GetValue(GeometryProperty); }
set { SetValue(GeometryProperty, value); }
}
public static readonly DependencyProperty GeometryProperty =
DependencyProperty.Register("Geometry",
typeof(Geometry),
typeof(GeometryButton),
new PropertyMetadata(default(Geometry)));
}
问题是,如果我要定义 GeometryToggleButton 和 GeometryRadioButton 类,我应该在每个类中重复 DependencyProperty 代码,违反 DRY。
另外,由于 RadioButton 派生自 ToggleButton,而后者和 Button 又派生自 ButtonBase,我想我可以利用这一点,但如果我需要分别从每个类继承,我根本不会从继承中受益。
所以我考虑使用AttachedProperties,但是教程和示例中通常会提到DockPanel.Dock、Grid.Left或Control.Foreground之类的示例,暗示存在一些“Parent”,所以我不确定:
- AttachedProperties 概念是否首先适用于我的用例?
- 如果是,我应该如何实施?
【问题讨论】:
标签: c# wpf xaml dependency-properties attached-properties