8

我发现了一个问题,询问如何避免将自定义值转换器添加到应用程序资源中:

在 WPF 中使用值转换器,而不必先将它们定义为资源

但是,我想更进一步,然后注册隐含的转换器,如本例所示:

<SolidColorBrush Color="Blue" />

在这里,我假设一些隐含的“StringToSolidColorBrushConverter”正在启动,使示例工作。

此示例不起作用

<Window.Resources>
    <Color x:Key="ForegroundFontColor">Blue</Color>
</Window.Resources>

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock>

我相信这是因为 WPF 没有任何暗示ColorToSolidColorBrushConverter可以直接使用。我知道如何创建一个,但我将如何“注册”它以便 WPF 自动使用它而不在绑定表达式中指定转换器?

4

1 回答 1

4

如果你查看源代码,你会发现这个

public sealed class SolidColorBrush : Brush
{
  public Color Color
  { ... }
  ...
}

[TypeConverter(typeof (ColorConverter))]
public struct Color : IFormattable, IEquatable<Color>
{
    ...
}

转换由 ColorConverter 完成。

并且

[TypeConverter(typeof (BrushConverter))]
public abstract class Brush : Animatable, IFormattable, DUCE.IResource
{ ... }

public class TextBlock : ...
{  
   public Brush Foreground
   { ... }
}

由 BrushConverter 完成转换的地方。

没有可以注册的“隐式”转换。这一切都是通过将具有适当值转换器类型的 TypeConverter 属性应用于相关属性或类来完成的。

在您的示例中,您需要使用

<Window.Resources>
    <SolidColorBrush x:Key="ForegroundFontColor" Color="Blue"/>
</Window.Resources>

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock>
于 2012-04-17T17:29:46.793 回答