0

对于我的应用程序主题,我创建了一个单独的类库 MyApp.Themes.dll。在这个库的根文件夹中,我有 Standard.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary 
      Source="pack://application:,,,/MyApp.Themes;component/Standard/Accordion.xaml"/>
  </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

在标准文件夹中,我有 Accordion.xaml:

<ResourceDictionary xmlns:layoutPrimitivesToolkit="..."
                    xmlns:layoutToolkit="..."
                    ...>
  <!--  layoutPrimitivesToolkit:AccordionButton  -->
  <Style TargetType="layoutPrimitivesToolkit:AccordionButton">
    ...
  </Style>

  ...
</ResourceDictionary>

这是 WPF Toolkit Accordion 控件的默认样式,除了 AccordionItem 的样式被修改为将背景设置为透明(而不是蓝色,这是一个已知的错误)。

对于这两个 xaml 文件,构建操作都设置为“资源”。现在,在 MyApp WPF 项目中引用 MyApp.Themes 库后,在 App.xaml 中我写了以下内容:

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary             
        Source="pack://application:,,,/MyApp.Themes;component/Standard.xaml" />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

它不起作用(没有错误;只是样式未应用)。如果我直接在 App.xaml 中复制和粘贴 Accordion.xaml 样式,那么它可以工作。有人建议添加虚拟资源字典,所以我在 App.xaml 中 MergedDictionaries 结束标记后添加了以下内容:

<Style TargetType="{x:Type layoutToolkit:AccordionItem}" /> 

再次,它不起作用。有人可以帮我解决这个问题吗?顺便说一句,我没有尝试其他人建议的方法 - 使用 basedOn。如果我必须这样做,我想在 MyApp.Themes 中进行,因为它可以更好地在 App.xaml 中使用主题。先感谢您。

UPDATE1:如果我直接将 Accordion.xaml 内容复制并粘贴到 Standard.xaml 就可以了

UPDATE2:我在 Standard.xaml 中尝试了本地程序集资源文件 URI(http://msdn.microsoft.com/en-us/library/aa970069.aspx):

<ResourceDictionary Source="pack://application:,,,/Standard/Accordion.xaml"/>

它抛出一个错误,说未找到标准/手风琴.xaml。

4

1 回答 1

1

.NET 中似乎存在错误。请参阅下面的线程:

引用包含合并字典的资源字典时遇到问题

此外,微软网站上有一个连接页面:

https://connect.microsoft.com/VisualStudio/feedback/details/609601/merge-dictionaries-does-not-work-when-we-merge-merged-dictionaries#tabs

于 2012-10-01T11:04:30.267 回答