在运行时找不到基于先前定义的StaticResource的样式

时间:2013-08-20 13:59:36

标签: wpf telerik rad-controls

我正在使用Telerik的RadControls来实现WPF的隐式样式。 Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml中定义了以下样式:

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

我自己的样式和Telerik默认样式在文件夹Lib.Windows.Controls中的程序集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中合并。

我确定我错过了一些明显的东西,但我无法弄清楚是什么。

的App.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不会覆盖构造函数。事实上它没有做任何事情。

更新

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

但是,我仍然想知道为什么会这样。

1 个答案:

答案 0 :(得分:6)

您需要合并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字典是   仅在检查了所有的关键资源后才进行检查   声明MergedDictionaries的ResourceDictionary。