2012-04-17 26 views
6

znalazłem pytanie z prośbą o sposobów, aby uniknąć dodawania konwertery wartość niestandardową do swoich zasobów aplikacyjnych:WPF: Jak zarejestrować dodatkowe domyślne konwertery wartości?

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

Jednak chciałbym pójść o krok dalej, że i zarejestrować konwerterów, które następnie są niejawne, jak w ten przykład:

<SolidColorBrush Color="Blue" /> 

Tutaj jestem przy założeniu, że część niejawna „StringToSolidColorBrushConverter” jest kopanie w sprawia, że ​​przykładowe prace.

Ten przykład ma nie praca:

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

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

wierzę, to dlatego, że nie ma implcit ColorToSolidColorBrushConverter że WPF można po prostu podnieść i używać. Wiem, jak go utworzyć, ale jak mam go "zarejestrować", aby WPF używało go automagicznie bez określania konwertera w wyrażeniu wiążącym?

+1

To [funkcja jest dostępna poprzez 'TypeConverter's] (http://msdn.microsoft.com/en-us/library/aa970913.aspx) i nie jestem do końca pewien, czy możesz wprowadzić go w czasie wykonywania w rozsądny sposób, ponieważ wymaga on atrybutów na klasach lub właściwościach, których nie posiadasz. – user7116

Odpowiedz

4

Jeśli spojrzeć na kodzie źródłowym znajdziesz to

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

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

Przemiana odbywa się przez ColorConverter.

A także

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

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

Jeżeli konwersja jest wykonywana przez BrushConverter.

Nie ma "niejawnej" konwersji, którą można zarejestrować. Wszystko to odbywa się poprzez zastosowanie atrybutów TypeConverter z typem odpowiedniego konwertera wartości do odpowiednich właściwości lub klas.

W przykładzie trzeba użyć

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

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