Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 运行时未找到基于先前定义的StaticResource的样式_Wpf_Telerik_Rad Controls - Fatal编程技术网

Wpf 运行时未找到基于先前定义的StaticResource的样式

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中,我定义了以下样式(空,用于测试)

我使用Telerik的RadControls为WPF提供隐式样式。
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>