Стиль на основе ранее определенного 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.