代码之家  ›  专栏  ›  技术社区  ›  testing

合并的资源字典可以从App.xaml访问资源吗?

  •  2
  • testing  · 技术社区  · 7 年前

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

    应用程序崩溃

    找不到名为/Key Primary的资源

    我可以把所有的东西放在一个大的风格。xaml,或者复制每个xaml文件中所需的值,但是没有其他选项吗?合并词典是否可以包含另一个合并词典?还是类似的?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Mark W    7 年前

    我使用了分开的词典,并试图保持它们的使用顺序。在我的申请中,我有:

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

    <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文件更小。然而,我要说的是,有时VisualStudio会给我一堆乱七八糟的东西,抱怨它无法找到名称空间……但只有在文件打开时。 我还体验到,在运行时,静态资源声明的顺序并不重要,有时,如果样式不是自上而下的格式,VisualStudio中的设计器将不会呈现样式。

    祝你好运

        2
  •  0
  •   disklosr    7 年前

    试试这个:

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