WPF:如何注册其他隐式值转换器?

Nei*_*ell 7 .net wpf ivalueconverter

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

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

但是我想超越它并注册那些隐含的转换器,如下例所示:

<SolidColorBrush Color="Blue" />
Run Code Online (Sandbox Code Playgroud)

在这里,我假设一些隐含的"StringToSolidColorBrushConverter"正在踢,这使得示例工作.

这个例子并不能正常工作:

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

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock>
Run Code Online (Sandbox Code Playgroud)

我相信这是因为没有任何证据ColorToSolidColorBrushConverter表明WPF可以拿起并使用它.我知道如何创建一个,但是如何"注册"它以便WPF自动使用它而不在绑定表达式中指定转换器?

Phi*_*hil 4

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

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

[TypeConverter(typeof (ColorConverter))]
public struct Color : IFormattable, IEquatable<Color>
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

转换由 ColorConverter 完成。

并且

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

public class TextBlock : ...
{  
   public Brush Foreground
   { ... }
}
Run Code Online (Sandbox Code Playgroud)

其中转换是由BrushConverter完成的。

您无法注册任何“隐式”转换。这一切都是通过将具有适当值转换器类型的 TypeConverter 属性应用到相关属性或类来完成的。

在你的例子中你需要使用

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

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock>
Run Code Online (Sandbox Code Playgroud)