2013-08-20 2 views
6

Я использую RadControls от Telerik для WPF с неявным стилем. Следующий стиль определяется в Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml:Стиль, основанный на ранее заданном StaticResource, не найден во время выполнения

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

Update

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

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

+0

Я думаю TelerikCustomizations.xaml не в состоянии найти RadRibbonViewStyle в BasedOn = "{StaticResource ResourceKey = RadRibbonViewStyle}" – ethicallogics

+0

Да, но почему? Темы/Windows8/Telerik.Windows.Controls.RibbonView.xaml объединяются прямо перед TelerikCustomizations.xaml. – cguedel

+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 является проверяется только после проверки всех в ключевые ресурсы ResourceDictionary, которые объявили MergedDictionaries.

+0

Итак, теоретически это также сработает, если вы включите '' Windows8/Telerik.Windows.Controls.RibbonView.xaml' в свой App.xaml перед 'MyTheme.xaml', но я не уверен в этом. Из документации неясно, работает ли 'StaticResource' для прямых« сестринских словарей »или он также не работает между« филиалами сестринского словаря »... – nemesv

+0

Большое вам спасибо, это объясняет многое;) – cguedel

 Смежные вопросы

  • Нет связанных вопросов^_^