Стиль на основе ранее определенного StaticResource не найден во время выполнения

Я использую RadControls Telerik для 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 явно находится в первой строке конструктора.

если это имеет значение, объединенный словарь фактически объединен в приложении.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 не перезаписывает конструктор. На самом деле она ничего не делает.

обновление

если я объединю словари Telerik в TelerikCustomizations.xaml вместо того, чтобы сливать их в еще один словарь (MyTheme.xaml), за исключением исчезает.

тем не менее, я все равно хотел бы знать, почему это происходит.

1 ответов


вам нужно слиться в 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:

в последовательности поиска ресурсов a словарь MergedDictionaries проверено только после проверки всех ключевые ресурсы ResourceDictionary, который объявил MergedDictionaries.