WPF自定义控件模板未应用

时间:2010-11-13 18:05:37

标签: wpf custom-controls controltemplate resourcedictionary

我确信这个问题或它的衍生物已被问过无数次,但我找不到任何帮助我解决问题的东西,所以我问。请随时告诉我我确定存在但我找不到的副本。显然我对关键词不太满意。

我有一个自定义控件,它有自己的资源字典,仅用于定义控件模板。然后将该字典合并到Generic.xaml中。

问题是当这个控件出现在UI中时,它内部没有任何内容。我使用Snoop来查找它。控件位于UI中,但它完全是空的。

您将在下面找到我认为对此问题负责的项目。我们非常感谢您提供的任何帮助或建议。

我的文件夹结构的相关部分是这样的:

My Directory Structure

BasicTemplate.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WPFSpecBuilder.Layouts.Templates">

    <Style TargetType="{x:Type local:BasicTemplate}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:BasicTemplate}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid>
                            <TextBlock Text="This is a basic template." />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Generic.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Layouts/Templates/XAML/BasicTemplate.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

3 个答案:

答案 0 :(得分:1)

试试这个:

  1. 将Build Action设置为BasicTemplate.xaml到Page。

  2. 在Generic.xaml中添加对BasicTemplate.xaml的引用:

    ResourceDictionary Source =“/ WPDSpecBuilder; component / Layouts / Templates / Xaml / BasicTemplate.xaml”

  3. 它应该有用。

答案 1 :(得分:1)

我认为这可能就像更改合并字典的相对路径一样简单。尝试将/添加到文件夹路径的开头:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Layouts/Templates/XAML/BasicTemplate.xaml" />
</ResourceDictionary.MergedDictionaries>

答案 2 :(得分:1)

尝试:

<ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="pack://application:,,,/WPDSpecBuilder;component/Layouts/Templates/XAML/BasicTemplate.xaml" />
</ResourceDictionary.MergedDictionaries>

See here for more details on Pack Uri's