我的自定义控件派生自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>
答案 0 :(得分:3)
您的控件的模板可以通过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
请注意,如果模板中未包含适当命名的this.buttonPart
,null
可能为ButtonBase
。您应该努力确保在缺少模板部件时控件仍然有效。