首页 > 解决方案 > WPF - 一种颜色的奇怪行为绑定问题

问题描述

我有一个包含导航相关用户控件的窗口,该控件的布局主要由数据绑定驱动。数据上下文是一个“状态”对象,它有一个“状态样式”子对象,其中包含所有格式,如前景、背景、字体大小等......

当此控件的数据上下文的状态设置为“不完整”状态时,它会获取一个新的 StatusStyle 对象,该对象定义了白色背景(默认为绿色)和非常深灰色的前景 (#333333)。

一切都经过完美测试,我们有几个测试人员没有任何问题。然后我们将此代码推广到生产中的一小群人,突然这些人随机看到这个控件得到一个白色的背景和一个白色的前景

截屏

我 - 知道 - 绑定正在工作,因为如果没有,控件将不会获得白色背景。所有其他样式参数也在工作(字体大小等)。

更奇怪的是,唯一受影响的似乎是这一种深灰色。发生此问题时,应用程序中使用相同颜色的所有其他位置(TextBlocks 等)都以白色文本结束。

整个配色方案都以完全相同的方式在同一个地方定义:

namespace Styling.Colors
{
  public static class Fonts
  {
    public static Color DarkBlue { get; set; } = (Color)ColorConverter.ConvertFromString("#003366");
    public static Color DarkGray { get; set; } = (Color)ColorConverter.ConvertFromString("#333333");
    ...etc...
  }

  public static class FontBrushes
  {
    public static SolidColorBrush DarkBlue { get; set; } = new SolidColorBrush(Fonts.DarkBlue);
    public static SolidColorBrush DarkGray { get; set; } = new SolidColorBrush(Fonts.DarkGray);
    ...etc...
  }
}

这是在 XAML 中使用的示例:

<Style TargetType="{x:Type DataGridRow}">
  <Setter Property="Foreground" Value="{Binding Source={x:Static colors:FontBrushes.DarkGray}}" />
</Style>

...以及代码隐藏中的用法:

public override SolidColorBrush ForegroundColor { get; set; } = Styling.Colors.FontBrushes.DarkGray;

同样,在所有引用这种特定颜色的地方,对于某些生产用户来说,它随机出现白色,我无法复制它(而且它从未出现在生产前的测试中)。当我测试时,它看起来总是正确的。同一配色方案中的所有其他颜色看起来都正确。

在这一点上我能想到的只是它是某种资源问题,比如内存或图形问题,但我只是在这里摸不着头脑。这是一个静态画笔,所以我认为它只会被分配一次,并且会继续被引用。没有设置或修改颜色的代码 - 它只是读取画笔。

有任何想法吗?

编辑:好的,我在这里有一个小突破。似乎有一个单独的第 3 方插件也在同一个应用程序中运行,当它启动时,它具有某种主题管理器,可以将新资源字典添加到合并字典中:

System.Windows.Application.Current.Resources.MergedDictionaries.Add((ResourceDictionary) new StyleResources());

...并且其中有一些规则几乎可以肯定是改变画笔颜色的原因。但是,我无权访问此主题管理器/样式字典的代码,所以有没有一种好方法可以以编程方式转储整个资源字典,以便其中一个用户保存然后发送给我检查?

标签: c#wpf

解决方案


推荐阅读