8

我正在使用带有隐式样式的 Telerik 的 RadControls for WPF。以下样式定义在Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml

<Style TargetType="telerikRibbonView:RadRibbonView" x:Key="RadRibbonViewStyle">
...
</Style>

Lib.Windows.Controls我自己的样式和 Telerik 默认样式在文件夹中的程序集中像这样合并Themes

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Windows8/Telerik.Windows.Controls.RibbonView.xaml" />        
        <ResourceDictionary Source="MyTheme/TelerikCustomizations.xaml" />

        <ResourceDictionary>
            <!-- avoid optimization -->
            <Style TargetType="{x:Type Rectangle}" />
        </ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

TelerikCustomizations.xaml我定义以下(空的,用于测试目的)样式:

<Style x:Key="MyThemeRadRibbonViewStyle" TargetType="{x:Type telerik:RadRibbonView}" BasedOn="{StaticResource ResourceKey=RadRibbonViewStyle}" />

这会在运行时导致以下异常:

'Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.' Line number '4' and line position '42'. {"Cannot find resource named 'RadRibbonViewStyle'. Resource names are case sensitive."}

这导致我在 MyView.xaml.cs 中使用以下调试语句:

public ShellView()
{
    var baseStyle = FindResource("RadRibbonViewStyle");
    var inherited = FindResource("MyThemeRadRibbonViewStyle");
    InitializeComponent();
}

现在的事情是:在第二次FindResource调用时抛出异常。带有完全相同的消息。但是RadRibbonViewStyle,在构造函数的第一行中可以清楚地找到。

如果重要的话,合并的字典实际上会第二次合并到 App.xaml 中。

我确定我遗漏了一些明显的东西,但我不知道是什么。

应用程序.xaml

<Application x:Class="TestClient.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Views/ShellView.xaml">
    <Application.Resources>
      <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/Lib.Windows.Controls;component/Themes/MyTheme.xaml" />

              <ResourceDictionary>
                    <!-- added to avoid optimization -->
                    <Style TargetType="{x:Type Rectangle}" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
</Application>

App.xaml.cs不会覆盖构造函数。事实上它什么也没做。

更新

如果我合并 Telerik 字典TelerikCustomizations.xaml而不是将它们合并到另一个字典 ( MyTheme.xaml) 中,异常就会消失。

但是,我仍然想知道为什么会发生这种情况。

4

1 回答 1

8

你需要Windows8/Telerik.Windows.Controls.RibbonView.xaml在你的 MyTheme/TelerikCustomizations.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Windows8/Telerik.Windows.Controls.RibbonView.xaml" />
        <ResourceDictionary>
            <Style x:Key="MyThemeRadRibbonViewStyle" TargetType="{x:Type telerik:RadRibbonView}" BasedOn="{StaticResource ResourceKey=RadRibbonViewStyle}" />
        </ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

现在您可以在任何地方使用/合并这本词典。

您需要这样做,因为StaticResource不在“姐妹”之间工作, MergedDictionaries因此您不能引用在同一级别合并的资源,因为StaticResource看起来只会向后直接父母:

来自MSDN

特定资源字典中的 XAML 资源引用必须引用已使用键定义的资源,并且该资源必须在词法上出现在资源引用之前。XAML 资源引用无法解析前向引用

但是使用时MergedDictionaries

在资源查找序列中,仅在检查了声明 MergedDictionaries 的 ResourceDictionary的所有键控资源之后才检查 MergedDictionaries 字典。

于 2013-08-20T15:00:55.153 回答