编辑:我能够在应用程序的一个非常精简的版本中重现这一点。这是 .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

有帮助吗?

解决方案 2

它没有解释为什么问题存在,但这里发现了一个修复程序:

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

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

其他提示

我的猜测是,对于 TextBlock,前景属性是从其父级继承的,除非您在 TextBlock 实例上显式设置它。例如,如果您将此文本块所在的窗口或用户控件更改为蓝色前景,它可以工作吗?你可以尝试做的一件事是风格而不是仅仅设置 Foreground 到一种颜色,设置 TextElement.Foreground. 。看看是否有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top