WPF StaticResource工作,DynamicResource不工作
我一直在尝试一段时间,但无济于事,在主题中创建了一堆笔刷,然后在自定义控件中将它们与DynamicResource一起使用。 我做的是这样的:
所以我的问题是,我找不到任何方法来定义主题中的默认值,以便我可以在应用程序中以编程方式更改它们。 StaticResource如何找到画笔和DynamicResource不??
我必须补充说,我已经创建了一个静态类,其中包含组件资源键作为属性,然后在xaml中用作{x:Static UI:ResourceScheme.ControlBackgroundKey}。 我的问题似乎与这一个类似:ComponentResourceKey作为DynamicResource问题,只有如果我将静态属性键替换为组件资源键的XAML标记,它仍然不起作用。
有人可以帮我在这里吗? :(
最后修复它。 看起来在另一个程序集中拥有组件资源键的类型导致了整个问题。 让我总结一下:
最终的结果是:
这个解决方案似乎是移动控件库中的资源类。
由于我仍然不知道为什么会发生这种情况,即使稍做改变,这个问题仍然存在:为什么它在第一种情况下不起作用?
这是区别,
在加载时加载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
<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