2

编辑:我能够在应用程序的一个非常精简的版本中重现这一点。这是 .zip 文件的链接

http://www.mediafire.com/?cn918gi15uph1xe

我让模块将视图添加到两个不同的区域 - 顶部的状态栏区域是问题发生的地方。奇怪的是,当将相同的视图类型添加到主区域时,没有任何问题。状态栏区域是 ItemsControl,主区域是 ContentPresenter。这是唯一的区别。

如果您有任何见解,请告诉我!谢谢。

-----原帖-----

大家好,

我看到 WPF 出现一些奇怪的行为。我正在使用 .NET 4 和 PRISM v4。我们构建应用程序的方式是皮肤资源字典存在于它们自己的程序集中。模块不引用这个程序集——相反,我们有一个皮肤管理器类,它从配置文件中读取我们想要的皮肤并将适当的组件加载到合并的字典中。合并字典在应用程序资源中设置(我们在添加之前清除 Application.Resources.MergedDictionaries)。这个想法是,如果需要,我们可以稍后在运行时切换皮肤,并且模块不需要知道皮肤直到运行时。

然后在我们的 xaml 中,我们使用 DynamicResource 引用样式。该问题与皮肤中定义并通过键引用的 TextBlock 样式有关,例如

<TextBlock Style="{DynamicResource someKey}" ... />

样式定义了字体系列、字体大小和前景。正确应用了字体系列和大小(我验证了这一点)。然而,前景总是黑色的。我使用 Snoop 和 WPF Inspector 来查看前景值是“继承”的,而不是来自样式。

我还有一个从 TextBlock 继承的控件,它所做的只是添加一些属性来确定文本值应该是什么(它根本不影响样式)。我能够为 Foreground 属性添加属性更改覆盖,并发现样式的前景值被应用,然后继承的值被应用。我无法让 .NET 源代码调试工作,所以我无法弄清楚第二次调用它的原因/位置......

这是一个来自具有完全相同问题的人的旧帖子的链接-他没有找到答案,而是找到了解决方法。不幸的是,解决方法仅适用于继承的控件(我无法为 TextBlocks 设置 InheritanceBehavior)。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3501ed19-ab40-4064-81b5-e9b7b9d35b56

4

2 回答 2

0

我的猜测是,对于 TextBlock,前景属性是从其父级继承的,除非您在 TextBlock 实例上明确设置它。例如,如果您将此文本块所在的 Window 或 UserControl 更改为具有蓝色的前景,它会起作用吗?您可以尝试做的一件事是样式,而不是仅设置Foreground为颜色 set TextElement.Foreground。看看这是否有效。

于 2011-05-13T01:04:57.900 回答
0

它没有解释为什么存在问题,但在这里找到了修复:

http://compositewpf.codeplex.com/discussions/257596

修复是在创建/添加视图到外壳之前加载皮肤。

于 2011-05-17T19:55:08.917 回答