C# 可重用的自定义控件模板

C# 可重用的自定义控件模板,c#,wpf,templates,custom-controls,C#,Wpf,Templates,Custom Controls,我对可重复使用的控件有问题,我需要你的帮助。问题如下所示,我创建了一个自定义控件: public class ControlExtender : ContentControl { static ControlExtender() { DefaultStyleKeyProperty.OverrideMetadata(typeof(ControlExtender), new FrameworkPropertyMetadata(typeof(ControlExtende

我对可重复使用的控件有问题,我需要你的帮助。问题如下所示,我创建了一个自定义控件:

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>
这个扩展程序类创建一个新的弹出窗口。弹出窗口的内容应为自定义控件ControlExtender。在我的XAML代码中,我希望实现如下语句:

p: Extender.ControlTemplate = "{?}" 
但是如何在这里指定自定义控件ControlExtender?很抱歉,如果这个问题太琐碎了,但现在我被卡住了。

它相当简单

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

p:Extender.ControlTemplate = "{Binding Setters[0].Value, Source={StaticResource {x:Type controls:ControlExtender}}}" 
如果存在诸如在编译时解决问题之类的问题,您也可以使用DynamicSource,这将有效地查找模板

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

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

我想我遗漏了什么。等待让我纠正一下。上面的示例仅检索样式。您是对的!通过您的第一个解决方案,我得到消息:“System.Windows.Style”不是属性“ControlTemplate”的有效值。我也找到了这个解决方案,但您的更正:“绑定Setter[0]。值,源…”得到了很好的解决!非常感谢你!
p:Extender.ControlTemplate = "{Binding Setters[0].Value, Source={DynamicResource {x:Type controls:ControlExtender}}}"