WPF:我如何注册额外的隐式值转换器?

8
我发现有人提出了一个问题,询问如何避免向应用程序资源中添加自定义值转换器的方法: 在WPF中使用Value Converter时,不必先将它们定义为资源 然而,我想更进一步,注册转换器后它们会变成隐式的,就像这个例子:
<SolidColorBrush Color="Blue" />

在这里,我假设有一个隐含的“StringToSolidColorBrushConverter”,使得示例能够运行。

这个例子不起作用

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

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

我认为这是因为WPF没有默认的ColorToSolidColorBrushConverter可供使用。我知道如何创建一个,但是我该如何“注册”它,以便WPF可以自动使用它,而不需要在绑定表达式中指定转换器呢?


1
该功能是通过 TypeConverter 提供的(http://msdn.microsoft.com/en-us/library/aa970913.aspx),我不确定您是否可以以合理的方式在运行时注入它,因为它需要类或属性上的属性,而这些属性并非您所拥有。 - user7116
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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接