【问题标题】:WPF resource merged to Application.Resources but not resolved at runtimeWPF 资源合并到 Application.Resources 但在运行时未解析
【发布时间】:2010-03-30 08:23:54
【问题描述】:

我有一个属于ResourceDictionary 的画笔,该画笔已合并到Application.Resources

但由于某种原因,当样式应用于其中一个控件时,它不会在运行时解决。但是,如果我在引发异常时从即时窗口调用 Application.Current.FindResource("BrushName"),则会找到资源。

我错过了什么吗? WPF 不应该尝试在应用的资源中查找资源吗?

更新 应用程序很大,所以我无法发布所有实际代码,但这是合并和使用资源的方式:

Brushes.xaml

<ResourceDictionary ...>
  <SolidColorBrush x:Key="BrushName" Color="#12345678" />
</ResourceDictionary>

SomeStyles.xaml

<ResourceDictionary ...>
  <Style x:Key="SomeStyle">
    <Setter Property="SomeProperty" Value="{StaticResource BrushName}" />
  </Style>
</ResourceDictionary>

App.xaml

<Application ...>
  <Application.Resources>

    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Brushes.xaml" />
        <ResourceDictionary Source="SomeStyles.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>


  </Application.Resources>
</Application ...>

然后一些控件可能会使用这样的资源使用样式:

...
Style={StaticResource SomeStyle}
...

更新

这似乎发生在用代码创建的菜单和控件上。它是否与那些不属于任何窗口的可视化树的控件和菜单有关?

【问题讨论】:

  • 您能否发布一些有关如何合并字典的代码。
  • 我在这里复制了您的示例,它为我正确构建和运行,看来问题出在您代码中的其他地方。
  • 有幸得到这个答案吗?

标签: wpf resources resourcedictionary


【解决方案1】:

您的 SomeStyle.xaml 字典需要直接引用 Brushes.xaml 字典,如下所示:

<ResourceDictionary ...>
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml" />
  </ResourceDictionary.MergedDictionaries>
  <Style x:Key="SomeStyle">
    <Setter Property="SomeProperty" Value="{StaticResource BrushName}" />
  </Style>
</ResourceDictionary>

StaticResources 仅向上搜索当前字典的树,因此您需要传入它需要引用的任何资源。

【讨论】:

    【解决方案2】:

    您是否在 XAML 标记扩展中使用 DynamicResource?

    您的 xaml 应该是 {DynamicResource brushName} 而不是 {StaticResource brushName}

    【讨论】:

    • 是的,它确实会影响性能,但它影响性能的原因是它具有更大的查找范围。 StaticResource 仅当资源在编译时位于当前范围内时才有效,DynamicResource 将在运行时查找范围。性能会受到影响,但至少会起作用。
    • 嗯,我明白它为什么会影响性能。问题是应用程序资源应该始终处于“当前范围”...
    • 嗯我的错误,我认为应用程序资源需要查找。我刚刚对此进行了测试,您是对的。
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2015-03-10
    • 2011-01-23
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多