可重用的自定义控件模板

本文关键字:自定义控件 | 更新日期: 2023-09-27 18:11:41

我有一个可重用控件的问题,我需要你的帮助。问题是这样的,我已经创建了一个自定义控件:

public class ControlExtender : ContentControl
{
    static ControlExtender()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ControlExtender), new FrameworkPropertyMetadata(typeof(ControlExtender)));
    }
    public override void OnApplyTemplate()
    {
    }
}

另外我有一个ControlTemplate

<Style TargetType="{x:Type controls:ControlExtender}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    ...content....
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我创建了一个额外的类,其中包含一些AttachedProperties。除其他外,这一条:

public class Extender
{
    public static readonly DependencyProperty ControlTemplateProperty = DependencyProperty.RegisterAttached(
        "ControlTemplate", 
        typeof(ControlTemplate), 
        typeof(Extender), 
        new FrameworkPropertyMetadata(
            null, 
            MetadataOptions, 
            OnControlTemplateChanged, 
            CoerceRadingControlTemplate));
    public static ControlTemplate GetControlTemplate(UIElement element)
    {
        return (ControlTemplate)element.GetValue(ControlTemplateProperty);
    }
    public static void SetControlTemplate(UIElement element, ControlTemplate value)
    {
        element.SetValue(ControlTemplateProperty, value);
    }

这个Extender类创建一个新的弹出窗口。弹出窗口的内容应该是自定义控件ControlExtender。在我的XAML代码中,我想实现这样的语句:

p: Extender.ControlTemplate = "{?}" 

但是我如何在这里指定自定义控件ControlExtender ?对不起,如果这个问题太微不足道,但现在我卡住了。

可重用的自定义控件模板

这很简单

既然您已经定义了目标类型,那么它也可以作为资源

的键。
p:Extender.ControlTemplate = "{Binding Setters[0].Value, Source={StaticResource {x:Type controls:ControlExtender}}}" 

这将有效地寻找模板,如果有一些问题,如在编译时解决,你可以使用DynamicResource也

p:Extender.ControlTemplate = "{Binding Setters[0].Value, Source={DynamicResource {x:Type controls:ControlExtender}}}"

这就是检索已定义模板的全部内容,这里的技巧是获取第一个setter的值也就是控制模板