2012-04-17 39 views
6

我發現了一個問題,詢問如何避免添加自定義值轉換器,以一個人的應用程序資源:WPF:如何註冊其他隱式值轉換器?

Using Value Converters in WPF without having to define them as resources first

但是我想多走了一步超出並註冊,然後可隱含轉換器,在下面這個例子:

<SolidColorBrush Color="Blue" /> 

在這裏,我假設一些隱含的「StringToSolidColorBrushConverter」被踢入,使例子的工作。

這個例子確實工作:

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

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

我相信這是因爲沒有implcit ColorToSolidColorBrushConverter是WPF可以只需拿起和使用。我知道如何創建一個,但我怎樣「註冊」它,以便WPF自動使用它,而不必在綁定表達式中指定轉換器?

+1

那[經由設置功能'TypeConverter's(http://msdn.microsoft.com/en-us/library/aa970913.aspx)我不太確定你可以在運行時以合理的方式注入它,因爲它需要你不擁有的類或屬性的屬性。 – user7116 2012-04-17 16:54:29

回答

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>