2010-04-10 6 views
0

Je suis assez nouveau à WPF/XAML et je suis actuellement confronté à un problème.Contrôle personnalisé WPF avec image.

J'ai une solution avec deux projets, le premier projet est une bibliothèque de contrôle personnalisé avec un contrôle de forme de fenêtre personnalisé à l'intérieur. Le deuxième projet est une application WPF utilisant mon formulaire de fenêtre personnalisé.

Tout fonctionne bien sauf pour le formulaire Icône. Dans le projet d'application WPF je tournerai ma propriété icône de la fenêtre à /ProjectTwoNameSpace;component/Resources/Images/Film.ico, et dans le contrôle personnalisé WPF J'essaie de montrer que l'image de cette façon:

<Image Grid.Column="0" Margin="3" Width="27" Height="27"> 
    <Image.Source> 
     <BitmapImage UriSource="{Binding Path=Icon}" /> 
    </Image.Source> 
</Image> 

Mais ça ne marche pas, je reçois une erreur lors de l'exécution disant que la propriété UriSource ou StreamSource doit être définie pour ma balise <Image>.

Quelqu'un peut-il m'aider? Je pense que c'est un problème de débutant WPF.

Répondre

1

La propriété UriSource d'un BitmapImage ne peut pas être définie comme vous l'avez montré car elle est de type Uri et vous essayez de la définir en chaîne. Je dirais que la façon la plus simple d'accomplir ce que vous faites est de lier votre Image.Source à l'icône, puis de convertir la chaîne en un objet Image bitmap. En supposant que votre commande est dans une fenêtre, cela ressemblerait à quelque chose comme ça

<Window.Resources> 
    <converters:StringToBitmapImageConverter x:Key="stringToBitmapImageConverter" /> 
</Window.Resources> 

... 

<Image Grid.Column="0" Margin="3" Width="27" Height="27" 
    Source="{Binding Path=Icon, Converter={StaticResource stringToBitmapImageConverter}}"> 
</Image> 

Et le convertisseur ressemblerait à ceci:

class StringToBitmapImageConverter: IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     BitmapImage image = new BitmapImage(); 
     image.BeginInit(); 
     image.UriSource = new Uri(value as string); 
     image.EndInit(); 

     return image; 
    } 

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

    #endregion 
} 
+1

Votre solution est bonne, mais votre affirmation selon laquelle UriSource « ne peut pas être réglé par une liaison de données "est fausse. Vous ** pouvez ** lier UriSource à une propriété de type Uri. Ce que vous ne pouvez pas faire est de le lier à une propriété de chaîne sans convertisseur. –

+0

J'ai une erreur en essayant de coller la balise en disant que la propriété Resources n'a pas été trouvée dans le type de fenêtre. Où suis-je censé coller ce code XAML? – Karnalta

+0

Ca ne marche pas pour moi, je n'ai pas d'erreur de compilation mais l'image n'est pas là. La propriété d'icône est correctement définie car je peux voir l'icône dans la barre des tâches mais pas dans mon contrôle personnalisé. Peut-être que le problème provient du fait que ma propriété d'icône est définie sur l'espace de noms de l'application WPF et ne peut pas être trouvée dans l'espace de noms de la bibliothèque de contrôles WPF? – Karnalta

Questions connexes