c# - 控件作为依赖属性/WPF

标签 c# wpf wpf-controls

我的自定义控件派生自 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/

相关文章:

wpf - 如何在 TreeView 中混合数据绑定(bind)和静态级别?

wpf - 当用户在 TextBox 中按下 Enter 时如何开始动画

wpf - WPF 样式和派生类无法识别属性

WPF UserControl 或 ControlTemplate...(不确定)

c#哔声停止按钮

c# - Josh Smith MVVM 演示应用程序

c# - 在 ASP.NET Core 中更改 Controller 路由

c# - 如何找到变量声明未在 Roslyn 的类中使用?

c# - 我可以通过编程方式更改我发送的电子邮件中的字体和字体大小吗?

c# - 禁用/覆盖 WPF 控件上的突出显示