21

我似乎无法将合并字典添加到 XAML 中的合并字典集合中。

主题.xaml

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Mine;component/Themes/Palette.Blue.xaml"/>
    <ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/>
</ResourceDictionary.MergedDictionaries>

应用资源

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/> 
            <!--
            <ResourceDictionary Source=="/Mine;component/Themes/Palette.Blue.xaml"/>
            <ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/>
            -->
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

注意:如果我将两个 ResourceDictionaries 都放在 Appication.Resources MergedDictionary 中(注释掉 theme.xaml 并取消注释其他两个字典)它们都正确加载。但是,我们的资源定义方式,这可能意味着会加载相当多的资源,而对于动态加载,我希望能够定义模板。

4

3 回答 3

35

这是一个优化错误,请参阅链接

在 XAML 中创建每个对象时,如果存在默认样式(即带有 Type 键的样式),则应应用该样式。正如您可以想象的那样,有几种性能优化可以使(隐含的)查找尽可能轻量级。其中之一是我们不查看资源字典内部,除非它们被标记为“包含默认样式”。有一个错误:如果您的所有默认样式都嵌套在合并字典中,深度为三层(或更深),则顶部字典不会被标记,因此搜索会跳过它。解决方法是在根字典中将默认样式设置为任何东西。

因此,在根字典中添加一个虚拟样式可以解决这个问题。例子

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <!-- Dummy Style, anything you won't use goes -->
        <Style TargetType="{x:Type Rectangle}" />
    </ResourceDictionary>
</Application.Resources>
于 2010-11-06T15:00:07.383 回答
1

您的示例代码在 Palette.Blue.xaml 的 App.xaml 合并资源字典源中有一个双等号。我假设这是您在此处发布的示例的错字,但不是您真正的问题。

弄清楚如何在 XAML 中直接链接所有资源可能很棘手。最简单的方法是使用 Blend 中的资源面板。我创建了一个 Silverlight 应用程序,其中的资源文件命名为您的示例,然后在 Blend 中打开项目并很快将它们链接在一起。

应用程序.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SilverlightApplication1.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Theme.xaml" />
                <!--
                <ResourceDictionary Source="Palette.Blue.xaml"/>
                <ResourceDictionary Source="Template.xaml"/>
                -->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

主题.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Palette.Blue.xaml"/>
        <ResourceDictionary Source="Template.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

模板.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="TextBox">
        <Setter Property="Margin" Value="10" />
        <Setter Property="Width" Value="250" />
    </Style>
    <Style x:Key="ReadOnlyTextBoxStyle" TargetType="TextBox">
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Margin" Value="10" />
        <Setter Property="Width" Value="250" />
    </Style>
</ResourceDictionary>

调色板.蓝色.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush x:Key="BlueSolidColorBrush" Color="SkyBlue" />
</ResourceDictionary>

主页.xaml

<UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel x:Name="LayoutRoot" Background="Honeydew">
        <TextBox Text="Read Only Textbox"
                 Style="{StaticResource ReadOnlyTextBoxStyle}" />
        <TextBox Text="Blue Textbox"
                 Background="{StaticResource BlueSolidColorBrush}" />
        <TextBox Text="Read Only, Blue Textbox"
                 Style="{StaticResource ReadOnlyTextBoxStyle}"
                 Background="{StaticResource BlueSolidColorBrush}" />
    </StackPanel>
</UserControl>

当然,如果您要链接来自不同程序集的资源,它看起来会有所不同。实际上,在这种情况下,我建议考虑将您的字典合并到后面的代码中。

于 2010-08-12T13:12:07.527 回答
0

如果这发生在您自己的一个控件上,我发现另一种解决方案是将DefaultStyleKey属性设置为 null:

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(null));

我不知道为什么会这样,但它似乎!

于 2016-09-23T17:10:22.643 回答