【问题标题】:Can merged resource dictionaries access resources from App.xaml?合并的资源字典可以从 App.xaml 访问资源吗?
【发布时间】:2016-11-17 05:24:22
【问题描述】:

merged resource dictionaries 可以访问来自App.xaml 的资源吗?目标是拆分样式以使其更具可读性。

这就是我正在寻找的东西,但不能以这种方式工作:

App.xaml 在 UWP 项目中

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles\DefaultButtonStyle.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

    <!-- other custom styles, definitions, ThemeDictionaries, ... -->
    <Color x:Key="Primary">#dfdfdf</Color>
</Application.Resources>

DefaultButtonStyle.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:AppName.UWP.Styles">

    <!-- some definitions -->
    <Style TargetType="Button" x:Key="DefaultButtonStyle">
        <!-- my styles -->
        <Setter Property="Background" Value="{StaticResource Primary}" />
    </Style>
</ResourceDictionary>

应用崩溃

找不到具有名称/主要键的资源

我可以将所有内容放在一个大的 style.xaml 中,或者在每个 xaml 文件中复制所需的值,但没有其他选择吗?合并的字典可以包含另一个合并的字典吗?或者类似的东西?

【问题讨论】:

    标签: xaml uwp windows-10-mobile


    【解决方案1】:

    我使用了单独的字典,并尝试按使用顺序排列它们。在我的应用程序中,我有:

    • ColorsAndBrushes.xaml
    • SizesAndLayout.xaml
    • DefaultStyles.xaml
    • NamedStyles.xaml

    ColorsAndBrushes 看起来像这样:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:MyApp.App.Styles">
        <!-- Colors -->
        <Color x:Key="Color_Banner">#FF333232</Color>
        <!--overridden from themeresource-->
        <Color x:Key="SystemChromeDisabledLowColor">#FFA8A49F</Color>
        <Color x:Key="SystemAccentColor">#FF2877CF</Color>
        <!-- /Colors -->
    
        <!-- Brushes -->
        <SolidColorBrush x:Key="Brush_Banner" Color="{StaticResource Color_Banner}" />
        <!-- /Brushes -->
    </ResourceDictionary>
    

    尺寸和布局:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:MyApp.App.Styles">
        <!-- Padding -->
        <Thickness x:Key="Padding_Button">24,4</Thickness>
        <Thickness x:Key="Padding_Dialog">10</Thickness>
        <Thickness x:Key="Padding_Content">20</Thickness>
        <!-- /Padding -->
    
        <!-- Fonts -->
        <FontFamily x:Key="Font_DefaultFamily">Segoe UI</FontFamily>
        <FontWeight x:Key="Font_DefaultWeight">SemiLight</FontWeight>
        <FontWeight x:Key="Font_NormalWeight">Normal</FontWeight>
        <FontWeight x:Key="Font_BoldWeight">Semibold</FontWeight>
        <x:Double x:Key="ContentControlFontSizeSmall">11</x:Double>
        <x:Double x:Key="Font_NormalSize">20</x:Double>
        <x:Double x:Key="Font_H1Size">36</x:Double>
        <x:Double x:Key="Font_H2Size">28</x:Double>
        <!-- /Fonts -->
    </ResourceDictionary>
    

    DefaultStyles(适用于所有类型 - 这些使用来自其他 2 的资源):

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:MyApp.App.Styles">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ColorsAndBrushes.xaml" />
            <ResourceDictionary Source="SizesAndLayout.xaml" />
        </ResourceDictionary.MergedDictionaries>
    
        <Style TargetType="TextBlock">
            <Setter Property="FontFamily" Value="{StaticResource Font_DefaultFamily}" />
            <Setter Property="FontWeight" Value="{StaticResource Font_DefaultWeight}" />
            <Setter Property="FontSize" Value="{StaticResource Font_NormalSize}" />
            <Setter Property="TextWrapping" Value="WrapWholeWords" />
        </Style>
    </ResourceDictionary>
    

    和 NamedStyles 是默认的覆盖:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:MyApp.App.Styles">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ColorsAndBrushes.xaml" />
            <ResourceDictionary Source="SizesAndLayout.xaml" />
            <ResourceDictionary Source="DefaultStyles.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <Style x:Key="FontStyle_H1" TargetType="TextBlock" BasedOn="{StaticResource FontStyle_Default}">
            <Setter Property="FontSize" Value="{StaticResource Font_H1Size}" />
            <Setter Property="Foreground" Value="{StaticResource Brush_DarkBlue}" />
            <Setter Property="Margin" Value="{StaticResource Margin_TitleFont}" />
        </Style>
    </ResourceDictionary>
    

    最后,在 App.xaml 中:

    <Application
        x:Class="MyApp.App.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:MyApp.App"
        RequestedTheme="Light">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Styles/ColorsAndBrushes.xaml" />
                    <ResourceDictionary Source="Styles/SizesAndLayout.xaml" />
                    <ResourceDictionary Source="Styles/DefaultStyles.xaml" />
                    <ResourceDictionary Source="Styles/NamedStyles.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>
    

    它适用于我,并通过使用更小的范围文件来保持 XAML 文件更小。但是,我会说有时 Visual Studio 会给我一堆波浪线,抱怨它无法弄清楚命名空间......但只有在文件打开时才会如此。 我还经历过,虽然在运行时,静态资源的声明顺序并不重要,但有时,如果样式不是自上而下的格式,Visual Studio 中的设计器将不会呈现样式。

    祝你好运!

    【讨论】:

    • 我学到的东西: - 使用正斜杠 (/)。 - 在 XAML 中进行更改、重新编译、反转更改、重新编译然后应用您的样式。
    【解决方案2】:

    试试这个:

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles\DefaultButtonStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <!-- other custom styles, definitions, ThemeDictionaries, ... -->
            <Color x:Key="Primary">#dfdfdf</Color>
        </ResourceDictionary> 
    </Application.Resources>
    

    【讨论】:

    • 这似乎不起作用。我收到多个错误,例如 “Key”属性只能用于“IDictionary”中包含的元素。 等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多