2009-06-02 20 views
10

Me gustaría saber exactamente cómo usar dinámicamente un recurso de diccionario en el código C# detrás, es decir, me gustaría cargar imágenes en tiempo de ejecución desde un recurso de imagen dentro de un diccionariorecursos de imagen de wpf y cambio de imagen en wpf control en tiempo de ejecución

Tengo un programa que tiene 3 imágenes en un diccionario WPF - estas son imágenes establecidas como recursos de imágenes.

Luego, en el código detrás de mi ventana de WPF quiero cargar cualquiera de las tres imágenes en función de los eventos iniciados por el usuario.

No hay código real que mostrar, ya que nada de lo que he hecho funciona.

Ideas?

Respuesta

20

En primer lugar, asegúrese de que haya definido sus recursos de imagen como esta:

<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 segundo lugar, estoy asumiendo que su diccionario WPF es en su propio archivo. Ahora debe asegurarse de haber combinado su diccionario en el XAML de su ventana principal (omita este paso si su diccionario de recursos está definido dentro del XAML de la ventana). En archivo XAML de su ventana, asegúrese de que tiene algo como esto:

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

Ahora, en su código subyacente, puede utilizar el método FindResource() para localizar el recurso de imagen por su nombre clave (el valor de el atributo x: clave en el ImageSource en el diccionario de recursos), así:

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

Espero que esto ayude!

+0

ah, lo que me faltaba era la fusión de mi diccionario en la ventana. Recursos: ¡muy apreciado! – Tab

+0

Respuesta bien escrita. +1 y gracias! La exploración de MSDN es dolorosa para tales escenarios – Gishu

+0

Felicitaciones - corto dulce y muy preciso –

1

Esta es una adición a the accepted answer: Cuando se trabaja dentro de un ViewModel de MVVM, asegúrese de utilizar el FindResource de la vista en la que se añade el directorio de recursos.

<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> 

Mi opinión en este caso es una ventana (no sé MVVM correcta ;-))

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

Aquí el WindowReference es una referencia a My.MainWindow.

Cuestiones relacionadas