Я использую 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
), исключение исчезает.
Однако мне все же хотелось бы знать, почему это происходит.
Я думаю TelerikCustomizations.xaml не в состоянии найти RadRibbonViewStyle в BasedOn = "{StaticResource ResourceKey = RadRibbonViewStyle}" – ethicallogics
Да, но почему? Темы/Windows8/Telerik.Windows.Controls.RibbonView.xaml объединяются прямо перед TelerikCustomizations.xaml. – cguedel
Вам не хватает «Темы» из источника первого словаря ресурсов? –