依赖属性控制 / WPF

3

我有一个从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>
1个回答

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

请注意,如果模板中没有适当命名的ButtonBase,则此处的this.buttonPart可能会为null。您应该努力确保在缺少模板部件时,您的控件仍然可以正常工作。

1
顺便说一下,我发现你应该使用FindName(partName)而不是GetTemplateChild(partName) - Konstantin Vasilev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接