2012-04-17 13 views
6

Ho trovato una domanda chiedendo di modi per evitare l'aggiunta di convertitori di valore personalizzato per le proprie risorse applicative:WPF: Come posso registrare convertitori di valori impliciti aggiuntivi?

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

Tuttavia mi piacerebbe andare un passo oltre e registrare convertitori che sono poi implicita, come in questo esempio:

<SolidColorBrush Color="Blue" /> 

Ecco, io parto dal presupposto che alcuni implicito "StringToSolidColorBrushConverter" è calci-in che rende il lavoro di esempio.

Questo esempio fa non lavoro:

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

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

Credo che sia perché non v'è alcuna implcit ColorToSolidColorBrushConverter che WPF può solo raccogliere e utilizzare. So come crearne uno, ma come dovrei "registrarlo" in modo che WPF lo usi automaticamente senza specificare il convertitore nell'espressione di legame?

+1

Che [funzione viene fornita tramite 'TypeConverter's] (http://msdn.microsoft.com/en-us/library/aa970913.aspx), e non sono abbastanza sicuro di poterlo iniettare in runtime in modo sano in quanto richiede attributi su classi o proprietà che non possiedi. – user7116

risposta

4

Se si guarda il codice sorgente troverete questa

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

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

la conversione è fatta dal ColorConverter.

E anche

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

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

Dove la conversione è fatta da BrushConverter.

Non esiste una conversione "implicita" che è possibile registrare. Tutto avviene applicando gli attributi TypeConverter con il tipo di convertitore di valori appropriato alle proprietà o classi rilevanti.

Nel tuo esempio è necessario utilizzare

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

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