2

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

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

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

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


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

<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>

有任何想法吗?我必须以不同的方式合并字典吗?

4

2 回答 2

3

该代码不会很好地工作,因为资源字典中的 DataTemplate 不知道哪个在使用它,它只是使用过。像好莱坞模式。他们分别编译。

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

于 2009-11-03T01:25:56.050 回答
1

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

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

编辑

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

于 2009-11-03T01:44:14.157 回答