0

J'ai créé un contrôle utilisateur de petite taille composé d'un bouton dont le contenu est une image. J'ai créé une propriété de dépendance "ImageSource" sur le contrôle utilisateur afin de lier à partir de l'image à l'intérieur du bouton.Propriété de dépendance ImageSource sur un contrôle utilisateur - Jeu de valeurs XAML

Toutefois, dans le XAML où je posai une instance de mon contrôle utilisateur définissant la propriété renvoie une erreur lors de l'exécution:

<ctrl:ImageButton ImageSource="/Resources/Images/Icons/x.png" Command="{Binding Reset}" DisabledOpacity="0.1"/> 

et à l'exécution:

«/Ressources/Images/Icônes/x La chaîne .png 'n'est pas une valeur valide pour la propriété' ImageSource 'du type' ImageSource '. Le type 'ImageSource' n'a pas de classe publique TypeConverter.

J'ai ensuite créé un convertisseur:

public class StringToBitmapImage : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return new BitmapImage(new Uri((string) value, UriKind.RelativeOrAbsolute)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

puis décoré ma propriété de dépendance avec elle:

[TypeConverter(typeof(StringToBitmapImage))] 
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register(
     LambdaHelper.GetMemberName<ImageButton>(ib => ib.ImageSource), typeof (ImageSource), typeof (ImageButton)); 
    [TypeConverter(typeof(StringToBitmapImage))] 
    public ImageButton ImageSource 
    { 
     get { return (ImageButton)GetValue(ImageSourceProperty); } 
     set { SetValue(ImageSourceProperty, value); } 
    } 

mais encore WPF ne convertit pas ma chaîne à une ImageSource (BitmapImage) par exemple ..

Que faire?

Répondre

1

Il y a plusieurs choses incorrectes ici:

D'abord, votre propriété CLR retourne un ImageButton alors que la propriété de dépendance est définie comme une ImageSource. Deuxièmement, un convertisseur de type n'est pas le même qu'un convertisseur de valeur de liaison. Votre convertisseur de type doit dériver de TypeConverter et être appliqué sur la classe ImageSource plutôt que sur la propriété elle-même. Troisièmement, le type de cadre ImageSource a déjà un TypeConverterAttribute avec ImageSourceConverter comme convertisseur de type, donc tout devrait fonctionner sans avoir à écrire un convertisseur personnalisé. Assurez-vous de ne pas référencer une autre classe personnalisée ImageSource dans un autre espace de noms. Pour terminer, utilisez ImageBrush.ImageSource.AddOwner plutôt que de redéfinir une propriété de dépendance entièrement nouvelle.

Edit: pour répondre à un commentaire de Berryl:

public static readonly DependencyProperty ImageSourceProperty = ImageBrush.ImageSource.AddOwner(typeof(ImageButton); 

Ce morceau de code réutilisera la propriété ImageSource existante plutôt que de définir un nouveau (rappelez-vous que chaque autre propriété de dépendance s'enregistré dans un dictionnaire statique global) , définissant uniquement un nouveau propriétaire et éventuellement une nouvelle métadonnée. C'est comme OverrideMetadata mais d'une classe à l'extérieur.

+0

pouvez-vous montrer dans le code comment cette dernière partie (ImageBrush.ImageSource.AddOwner) serait utilisée? Merci – Berryl

+0

Merci! Ça a marché! :) –