我的自定义控件派生自 Control 类。我想创建另一个控件(例如按钮)的依赖属性并将其放在 ControlTemplate 中(这样按钮可以放在 xaml 中,MyControl 的用户可以订阅它的事件等)。谁能告诉我,我该怎么做?
这是结果代码示例:
public class MyControl: Control
{
static MyControl( )
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl)));
}
public static readonly DependencyProperty MyButtonProperty =
DependencyProperty.Register("MyButton",
typeof(Button),
typeof(MyControl),
new PropertyMetadata(default(Button)));
public Button MyButton
{
get
{
return (Button) GetValue(MyButtonProperty);
}
set
{
SetValue(MyButtonProperty, value);
}
}
}
xaml:
<ControlTemplate TargetType="{x:Type lib:MyControl}">
<Canvas>
<Border Child="{TemplateBinding MyButton}">
</Border>
</Canvas>
</ControlTemplate>
最佳答案
您的控件模板可以通过 TemplatePartAttribute
声明对子控件的依赖。 .然后,您在 OnApplyTemplate
中获得该依赖项的一个实例方法。
[TemplatePart(Name = PartButton, Type = typeof(ButtonBase))]
public class MyControl : Control
{
private const string PartButton = "PART_Button";
private ButtonBase buttonPart;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.buttonPart = GetTemplateChild(PartButton) as ButtonBase;
}
}
您的控件模板将类似于:
<Style TargetType="MyControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MyControl">
<Border ...>
<Button x:Name="PART_Button" .../>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style
请注意,如果模板中未包含适当命名的 ButtonBase
,则 this.buttonPart
可能为 null
。您应该努力确保您的控件在缺少模板部分时仍然有效。
关于c# - 控件作为依赖属性/WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16624164/