2009-06-02 33 views
10

Je voudrais savoir exactement comment utiliser dynamiquement une ressource de dictionnaire dans le code C# derrière - ie .. Je voudrais charger des images à l'exécution à partir d'une ressource d'image dans un dictionnairewpf ressources image et changement d'image dans le contrôle wpf à l'exécution

J'ai un programme qui a 3 images dans un dictionnaire WPF - ce sont des images définies comme ressources d'image. Puis, dans le code derrière ma fenêtre WPF, je veux charger l'une des trois images en fonction des événements initiés par l'utilisateur.

Il n'y a pas de vrai code que je dois montrer car rien de ce que j'ai fait ne marche.

Des idées?

Répondre

20

Tout d'abord, assurez-vous que vous avez défini vos ressources d'image comme ceci:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ImageSource x:Key="image1">images/image1.jpg</ImageSource> 
    <ImageSource x:Key="image2">images/image2.jpg</ImageSource> 
</ResourceDictionary> 

En second lieu, je suppose que votre dictionnaire WPF est dans son propre fichier. Vous devez maintenant vous assurer que vous avez fusionné votre dictionnaire dans le fichier XAML de votre fenêtre principale (passez cette étape si votre dictionnaire de ressources est défini dans le code XAML de la fenêtre). Dans le fichier XAML de votre fenêtre, assurez-vous que vous avez quelque chose comme ceci:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="myDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

Maintenant, dans votre code-behind, vous pouvez utiliser la méthode FindResource() pour localiser votre ressource d'image par son nom clé (la valeur de l'attribut x: Key sur l'ImageSource dans le dictionnaire de ressources) comme suit:

imageControl.Source = (ImageSource)FindResource("image1"); 

Espérons que cela aide!

+0

ah, ce qui me manquait était la fusion de mon dictionnaire dans la fenêtre. Ressources - très apprécié! – Tab

+0

Réponse bien écrite. +1 et merci! Parcourir MSDN est la douleur pour de tels scénarios – Gishu

+0

Kudos - court doux et très précis –

1

C'est un ajout à the accepted answer: Lorsque vous travaillez dans un ViewModel de MVVM, assurez-vous d'utiliser le FindResource de la vue où le répertoire des ressources est ajouté.

<Window x:Class="My.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:ViewModels="clr-namespace:My.ViewModels" 
     Title="USA Hockey Player Evaluation tool" 
     Icon="/USAHockeyPlayerEval;component/View/Images/HET.ico" 
     SizeToContent="WidthAndHeight" 
     MinHeight="500px" MinWidth="800px"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Images.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Window.DataContext> 
     <ViewModels:MainWindowMV/> 
    </Window.DataContext> 
    <StackPanel> 
     <Menu> 
      <MenuItem Header="File"> 
       <MenuItem Header="Save"></MenuItem> 

Mon point de vue dans ce cas est une fenêtre (je sais pas MVVM correct ;-))

Image img = new Image();          
img.Source = (ImageSource)WindowReference.FindResource("Pluse"); 

Ici, le WindowReference est une référence à My.MainWindow.