Ресурсы изображения wpf и изменение изображения в режиме wpf во время выполнения

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

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

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

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

Идеи?

Ответ 1

Сначала убедитесь, что вы определили свои ресурсы изображения следующим образом:

<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");

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

Ответ 2

Это дополнение к принятому ответу: При работе в 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.