WPF StaticResource工作,DynamicResource不工作

我一直在尝试一段时间,但无济于事,在主题中创建了一堆笔刷,然后在自定义控件中将它们与DynamicResource一起使用。 我做的是这样的:

  • 创建包含样式(作品)的主题generic.xaml
  • 添加一个字典在generic.xaml中合并,以包含应用程序中使用的画笔(作品)
  • 使画笔具有ComponentResourceKey键(作品)
  • 控制使用画笔作为静态资源(作品)
  • 使控制使用画笔作为动态资源(不工作,资源跟踪源说:尽管:System.Windows.ResourceDictionary警告:9:资源未找到;)
  • 动态添加App.Resources具有相同键的画笔(与动态资源一起工作,它会更改颜色,不会像预期的那样使用静态资源)
  • 所以我的问题是,我找不到任何方法来定义主题中的默认值,以便我可以在应用程序中以编程方式更改它们。 StaticResource如何找到画笔和DynamicResource不??

    我必须补充说,我已经创建了一个静态类,其中包含组件资源键作为属性,然后在xaml中用作{x:Static UI:ResourceScheme.ControlBackgroundKey}。 我的问题似乎与这一个类似:ComponentResourceKey作为DynamicResource问题,只有如果我将静态属性键替换为组件资源键的XAML标记,它仍然不起作用。

    有人可以帮我在这里吗? :(


    最后修复它。 看起来在另一个程序集中拥有组件资源键的类型导致了整个问题。 让我总结一下:

  • 有一个资源类将ComponentResourceKeys保存为静态属性。 资源键的构造函数中使用的类型是此类的类型。 这是在资源大会。
  • 在另一个程序集中有一个自定义控件的主题,即Controls组件,它使用关键字来定义一些使用资源类属性的画笔:{x:Static Namespace:ResourceClass.ResourceKeyProperty}
  • 在同一主题中,控件的模板使用画笔作为动态资源:{DynamicResource {x:Static Namespace:ResourceClass.ResourceKeyProperty}}
  • 还有一个应用程序使用这些控件并在应用程序资源中动态添加自定义画笔。 这些画笔与主题中的画笔具有相同的按键。
  • 最终的结果是:

  • 控件最初不使用画笔
  • 控件确实使用应用程序资源中添加的画笔
  • 如果在主题中使用StaticResource,则控件最初会使用画笔,但应用程序资源将被忽​​略
  • 这个解决方案似乎是移动控件库中的资源类。

    由于我仍然不知道为什么会发生这种情况,即使稍做改变,这个问题仍然存在:为什么它在第一种情况下不起作用?


    这是区别,

    在加载时加载StaticResource,这意味着您正在使用的资源密钥必须在使用前在词汇上定义。

    所以,在自定义控件的情况下,静态资源只能在同一个generic.xaml文件中的控件定义之上定义。 所以,如果你把你的画笔放在不同的xaml中,在静态资源的情况下肯定无法使用。

    这是原因,除非类型xaml的其他资源以某种导入形式包含在同一文件中的complile中,否则不能在该文件中使用静态资源。 它仅仅意味着文件/组件/控件的实际xaml一些应该包含您使用的静态资源的实际引用。

    现在我怀疑为什么DynamicResource不起作用,这是因为DynamicResource可能只会在应用程序的(其中控件是使用的)ResourceDictionary而不是generic.xaml中查找。

    我不是100%肯定的,但我觉得如果你定义了一个自定义控件,并且如果你使用DynamicResource,那么你的资源必须位于应用程序的资源字典或控件资源字典的父容器中,但它不能位于generic.xaml中。

    由于DynamicResource只会查找控件运行时的逻辑树中的键,所以它不能找到generic.xaml中的资源,除非在Application.Resources中明确添加了generic.xaml。

    总结:静态资源必须在编译时在同一个文件中以词汇形式提供,资源将在Application.Resources字典中可用,它仍然可以在逻辑树中查找,但在编译时只能在相同的dll或相同的generic.xaml中找到。

    必须在运行时在Application.Resources和控件的逻辑树中搜索DynamicResource。

    有关更多参考资料,请查看资源概述


    我试图重现你的问题来测试一些为什么它不起作用的理论,但是我不能重现这个问题。 该设置似乎工作。

    因此,我不会描述解决方案,而是描述非工作repro设置。

    解决方案

    目标框架:4.6

    项目

  • 控制
  • 引用
  • 资源
  • Theme.xaml
  • 资源
  • Keys.cs
  • WpfApplication
  • 引用
  • 控制
  • 资源
  • MainWindow.xaml
  • 文件内容

    Theme.xaml

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:r="clr-namespace:Resources;assembly=Resources">
        <Color x:Key="{x:Static r:Keys.PrettyColor}">Red</Color>
        <SolidColorBrush x:Key="{x:Static r:Keys.PrettyBrush}" 
                         Color="{DynamicResource {x:Static r:Keys.PrettyColor}}" />
    </ResourceDictionary>
    

    Keys.cs

    namespace Resources {
        using System.Windows;
    
        public static class Keys {
            public static readonly ComponentResourceKey PrettyBrush =
                new ComponentResourceKey(typeof(Keys), Ids.PrettyBrush);
    
            public static readonly ComponentResourceKey PrettyColor =
                new ComponentResourceKey(typeof(Keys), Ids.PrettyColor);
        }
    
        public static class Ids {
            public const string PrettyBrush = "PrettyBrush";
            public const string PrettyColor = "PrettyColor";
        }
    }
    

    MainWindow.xaml

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:resources="clr-namespace:Resources;assembly=Resources"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Controls;component/Theme.xaml" />
                </ResourceDictionary.MergedDictionaries>
                <Color x:Key="{x:Static resources:Keys.PrettyColor}">Blue</Color>
            </ResourceDictionary>
        </Window.Resources>
        <Border Background="{DynamicResource {x:Static resources:Keys.PrettyBrush}}" />
    </Window>
    

    对于懒惰的人,这里有一个截图:

    在这里输入图像描述

    链接地址: http://www.djcxy.com/p/50421.html

    上一篇: WPF StaticResource works, DynamicResource doesn't

    下一篇: implicit vs explicit interface implementation