可重复使用的自定义控件模板

时间:2014-07-07 14:00:09

标签: c# wpf templates custom-controls

我遇到了可重复使用控件的问题,我得到了你的帮助。问题看起来像这样,我创建了一个自定义控件:

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?对不起,如果这个问题太微不足道了,但现在我被卡住了。

1 个答案:

答案 0 :(得分:1)

这很简单

因为您已经定义了目标类型,所以它也充当了资源的关键

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的值,即控件模板