【问题标题】:Control as dependencyproperty / WPF控制为依赖属性/WPF
【发布时间】:2013-05-18 12:18:14
【问题描述】:

我有从 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>

【问题讨论】:

    标签: c# wpf wpf-controls


    【解决方案1】:

    您的控件模板可以通过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。您应该努力确保您的控件在模板部分丢失时仍然有效。

    【讨论】:

    • 对了,我发现你应该使用FindName(partName)而不是GetTemplateChild(partName)
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多