Wpf 运行时未找到基于先前定义的StaticResource的样式
我使用Telerik的RadControls为WPF提供隐式样式。Wpf 运行时未找到基于先前定义的StaticResource的样式,wpf,telerik,rad-controls,Wpf,Telerik,Rad Controls,我使用Telerik的RadControls为WPF提供隐式样式。Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml中定义了以下样式: <Style TargetType="telerikRibbonView:RadRibbonView" x:Key="RadRibbonViewStyle"> ... </Style> 在TelerikCustomizations.xaml中,我定义了以下样式(空,用于测试)
Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml
中定义了以下样式:
<Style TargetType="telerikRibbonView:RadRibbonView" x:Key="RadRibbonViewStyle">
...
</Style>
在TelerikCustomizations.xaml
中,我定义了以下样式(空,用于测试):
现在的问题是:在第二个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
)中合并它们,异常就会消失
但是,我仍然想知道为什么会发生这种情况。您需要在
MyTheme/TelerikCustomizations.xaml中的Windows8/Telerik.Windows.Controls.RibbonView.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
只向后查看直接父级:
发件人:
特定资源字典中的XAML资源引用必须
引用已使用密钥定义的资源,以及
该资源必须在词汇上出现在资源引用之前。
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 Source="MyTheme/TelerikCustomizations.xaml" />
<ResourceDictionary>
<!-- avoid optimization -->
<Style TargetType="{x:Type Rectangle}" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
在资源查找序列中,需要一个合并字典
仅在检查所有的已设置密钥的资源后才进行检查
声明合并字典的ResourceDictionary
我认为TelerikCustomizations.xaml无法在BasedOn=“{StaticResourceKey=RadRibbonViewStyle}”中找到RadRibbonViewStyle是的,但为什么?Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml在TelerikCustomizations.xaml之前被合并。您是否缺少第一个资源字典源中的主题?@RohitVats否,因为字典位于Themes文件夹中。我认为这会产生编译时错误,而不是运行时异常。您可以尝试使用DynamicResource
:BasedOn=“{dynamicResourceKey=RadRibbonViewStyle}”
或者您可以合并RibbonView.xaml
而不是直接合并app.xaml或合并字典,而是合并到您的TelerikCustomizations.xaml
中,并且在您的app.xaml中只引用TelerikCustomizations.xaml
。因此,要点是,TelerikCustomizations.xaml
和RibbonView.xaml
不应该在合并词典中彼此“相邻”。但是您的自定义应该取决于功能区。因此,从理论上讲,如果在MyTheme.xaml
之前的App.xaml中包含Windows8/Telerik.Windows.Controls.RibbonView.xaml
,那么这也行得通,但我不确定。从文档中不清楚StaticResource
是否不适用于直接的“姐妹词典”,或者它也不适用于“姐妹词典分支”…非常感谢,这解释了很多;)
<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>
<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>