2009-06-02 1 views
10

Я хотел бы точно знать, как динамически использовать ресурс словаря в коде C#, то есть .. Я хотел бы загружать изображения во время выполнения из ресурса изображения в пределах dictionaryРесурсы изображения wpf и изменение изображения в wpf-управлении во время выполнения

У меня есть программа, которая имеет 3 изображения в словаре WPF - это изображения, установленные как ресурсы изображения.

Затем в коде моего окна WPF я хочу загрузить любое из трех изображений на основе инициированных пользователем событий.

Нет настоящего кода, который я должен показать как ничего, что я сделал.

Идеи?

ответ

20

Во-первых, убедитесь, что вы определили свои ресурсы изображения, как это:

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

Во-вторых, я предполагаю, что ваш словарь WPF находится в отдельном файле. Теперь вы должны убедиться, что вы объединили словарь в XAML вашего основного окна (пропустите этот шаг, если ваш словарь ресурсов определен внутри XAML окна). В файле XAML вашего окна, убедитесь, что у вас есть что-то вроде этого:

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

Теперь, в вашем коде-позади, вы можете использовать метод FindResource(), чтобы найти свой ресурс изображения, это имя ключа (значение атрибут x: Key на ImageSource в словаре ресурсов):

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

Надеюсь, это поможет!

+0

ах, то, чего я отсутствовал, было слияние моего словаря с Window.Resources - высоко ценится! – Tab

+0

Красивый письменный ответ. +1 и спасибо! Просмотр MSDN - боль для таких сценариев – Gishu

+0

Kudos - короткая сладкая и очень точная –

1

Это дополнение к the accepted answer: При работе в ViewModel от MVVM, убедитесь, что использовать FindResource с точки зрения, где добавляется каталог ресурсов.

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

мой взгляд, в данном случае это окно (я не знаю, правильно MVVM ;-))

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

Здесь WindowReference является ссылкой на My.MainWindow.