资源字典中的DataTemplates不从app.xaml样式继承?

时间:2009-11-03 01:12:10

标签: wpf styles resourcedictionary app.xaml

我在app.xaml中添加了自定义命名样式。

我创建了一个外部资源字典(我在app.xaml的合并字典中附加),当我尝试在rcource字典中使用上述命名样式之一时,它表示没有这样的样式。 / p>

默认样式(即适用于整个应用程序的未命名样式)也不适用于模板元素。

注意:模板的构建操作是“页面”。


以下是我的代码编写方式的示例:

<Application x:Class="Application"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    ShutdownMode="OnExplicitShutdown">
    <Application.Resources>
        <ResourceDictionary>

            <Style
                    x:Key="StackPanelStyle" 
                    TargetType="StackPanel" 
                    BasedOn="{StaticResource {x:Type StackPanel}}">
                <Setter Property="Margin" Value="5"/>
                <Setter Property="Orientation" Value="Horizontal" />
                <Setter Property="Height" Value="40"/>
            </Style>

            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Templates/DataTemplate1.xaml"/>
                <ResourceDictionary Source="/Templates/DataTemplate2.xaml"/>
                <ResourceDictionary Source="/Templates/DataTemplate3.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这是数据模板的一个例子:

<DataTemplate DataType="{x:Type Entity}" x:Key="NameDataTemplate">
    <Expander>
        <StackPanel>
            <--The following line produces: StackPanelStyle was not found.-->
            <StackPanel Style="{StaticResource StackPanelStyle}">
                <Label Content="Name:"/>
                <TextBox Text="{Binding Name}"/>
            </StackPanel>
        </StackPanel>
    </Expander>
</DataTemplate>

有什么想法吗? 我是否必须以不同的方式合并字典?

2 个答案:

答案 0 :(得分:3)

代码无法正常运行,因为资源字典中的DataTemplate不知道哪个使用它,只是 使用。喜欢好莱坞模式。他们分开编译。

为了使这个工作,您可以将您在app.xaml中的样式放在DataTemplate的同一资源字典中,或者如果您不喜欢这种耦合,您可以将它放在不同的资源字典中,并且将其合并到DataTemplate的资源字典

答案 1 :(得分:1)

App.xaml的Build Action应该是ApplicationDefinition,资源字典文件的构建操作应该是Page。我猜你有两个都是正确的,因为它们是默认的(我看到你已经提到过关于Page)。

我无法想到你的情况有任何其他问题。只要您的静态资源以正确的顺序定义(它们看起来是正确的顺序),它就应该能够在您运行应用程序时找到它们。

修改

调试思路:使用简单的按钮样式创建一个名为“TestDictionary.xaml”的新资源字典。确保此词典与其他词典(DataTemplate1.xaml等)位于同一文件夹中。在MergedDictionaries中仅添加一个指向TestDictionary的链接(注释掉其他人)。在启动窗口上放置一个按钮并应用样式。看看是否有效。如果失败,您知道合并有问题。如果成功,可能会出现关于DataTemplate的问题。