如何在单个App.xaml中合并不同的资源?

时间:2019-06-27 08:13:00

标签: c# wpf

我有一个很长的App.xaml编码,其中包含我从Internet下载的自定义样式窗口的代码。

<Application x:Class="MyProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyProject"
             xmlns:sw="clr-namespace:MyProject.StyleableWindow"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
    <SolidColorBrush x:Key="WindowColor" Color="Red"/>
    <SolidColorBrush x:Key="WindowBackColor" Color="#FFC3C3C3"/>
    <SolidColorBrush x:Key="WindowForeColor" Color="Black"/>
    <SolidColorBrush x:Key="WindowForeHighlightColor" Color="WhiteSmoke"/>
................
................
................
................
            <Setter Property="Background" Value="Black"/>
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="Template" Value="{StaticResource WindowTemplate}"/>
        </Style>

昨天,我下载了一个自定义的切换按钮控件。为了使其发挥作用,我尝试在App.xaml中合并以下代码

    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="SwitchTypeToggleButton.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

但是它不起作用。我不断收到以下错误:

  

每本词典必须具有关联的键

我的切换按钮控制代码-(存储在MyProject> Folder1> Folder2中)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="SwitchTypeToggleButton"
           TargetType="{x:Type ToggleButton}">

        <Style.Resources>
            <Color x:Key="Color.Additional.LightGrey">#989EA8</Color>
            <Color x:Key="Color.Additional.MediumGrey">#61656B</Color>
............
............

我该怎么办才能消除错误?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

app.xaml中的资源应如下所示:

<Application.Resources>    
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="SwitchTypeToggleButton.xaml" />
    </ResourceDictionary.MergedDictionaries>
    <SolidColorBrush x:Key="WindowColor" Color="Red"/>
    ...
    <Setter Property="Template" Value="{StaticResource WindowTemplate}"/>
  </ResourceDictionary>      
</Application.Resources>

原因是,Application.Resources实际上总是需要为ResourceDictionary。只要您使用“简单”资源,就会隐式创建ResourceDictionary。但是,一旦要合并另一个ResourceDictionary,就必须明确指定包含该资源的字典。