53 votes

Comment convertir une couleur en pinceau en XAML?

Je souhaite convertir une valeur System.Windows.Media.Color en System.Windows.Media.Brush. La valeur de couleur est liée à la propriété Fill d'un objet Rectangle. La propriété Fill prend un objet Pinceau. J'ai donc besoin d'un objet IValueConverter pour effectuer la conversion.

Y at-il un convertisseur intégré dans WPF ou dois-je créer le mien? Comment puis-je créer le mien si cela devient nécessaire?

141voto

Jens Points 14829

Je sais que je suis vraiment en retard à la fête, mais vous n'avez pas besoin d'un convertisseur pour cela.

Vous pourriez faire

 <Rectangle>
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding YourColorProperty}" />
    </Rectangle.Fill>
</Rectangle>
 

68voto

Chris Valentine Points 15990

Il semble que vous deviez créer votre propre convertisseur. Voici un exemple simple pour commencer:

 public class ColorToSolidColorBrushValueConverter : IValueConverter {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            if (null == value) {
                return null;
            }
            // For a more sophisticated converter, check also the targetType and react accordingly..
            if (value is Color) {
                Color color = (Color)value;
                return new SolidColorBrush(color);
            }
            // You can support here more source types if you wish
            // For the example I throw an exception

            Type type = value.GetType();
            throw new InvalidOperationException("Unsupported type ["+type.Name+"]");            
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            // If necessary, here you can convert back. Check if which brush it is (if its one),
            // get its Color-value and return it.

            throw new NotImplementedException();
        }
    }
 

Pour l'utiliser, déclarez-le dans la section resource.

  <local:ColorToSolidColorBrushValueConverter  x:Key="ColorToSolidColorBrush_ValueConverter"/>
 

Et l’utiliser dans la liaison en tant que ressource statique:

   Fill="{Binding Path=xyz,Converter={StaticResource ColorToSolidColorBrush_ValueConverter}}"
 

Je ne l'ai pas testé. Faites un commentaire si cela ne fonctionne pas.

7voto

Jackson Pope Points 9294

Je voulais faire cette HCL de façon plutôt que d'Jens façon parce que j'ai beaucoup de choses liées à l' Color, donc il y a moins de duplication et de la chaudière-plaque .Fill des nœuds.

Cependant, quand on essaie de l'écrire, ReSharper m'a indiqué le WPF Toolkit's la mise en œuvre de la ColorToSolidColorBrushConverter. Vous devez inclure les éléments suivants déclaration d'espace de noms dans la Fenêtre principale/UserControl nœud:

xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended"

Ensuite, une ressource statique dans la Fenêtre/UserControl ressources:

<Toolkit:ColorToSolidColorBrushConverter x:Key="colorToSolidColorBrushConverter" />

Ensuite, vous pouvez le faire comme HCL réponse:

<Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" />

3voto

G.Y Points 2631

Avec quelques améliorations supplémentaires à la réponse HCL, je l’ai testée - cela fonctionne.

 public class ColorToSolidColorBrushValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        if (value is Color)
            return new SolidColorBrush((Color)value);

        throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.Convert()");
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        if (value is SolidColorBrush)
            return ((SolidColorBrush)value).Color;

        throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.ConvertBack()");
    }

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X