Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/75: Рейтинг темы: голосов - 75, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 19.09.2018
Сообщений: 16
WPF

Привязка string к Image.Source

07.04.2019, 21:54. Показов 15574. Ответов 23

Студворк — интернет-сервис помощи студентам
Уважаемые знатоки. Практически первая работа с WPF. Не могу сделать привязку метода из c# к image из XAML и вторая проблема - не понятно какие данные можно присваивать source , если это не прямой путь к изображению. Задача в том, чтобы привязать к 48 одинаковым изображениям в WPF значение из массива string или bitmapImage (как будет лучше для решения задачи) .Вариант ниже - работает отлично. Просто указываем путь к изображению.
XML
1
        <Image x:Name="image2" Source="Resources/black.bmp" HorizontalAlignment="Left" Height="50" Margin="187,18,0,0" VerticalAlignment="Top" Width="50" MouseLeftButtonUp="mouse_callback"/>
На этом моя удача заканчивается. Если создать string в c# , а потом ссылаться на нее в XAML , то ничего не получается
C#
1
public string img= "../Resources/white.bmp";
XML
1
        <Image x:Name="image1"  Source="img"  HorizontalAlignment="Left" Height="50" Margin="87,18,0,0" VerticalAlignment="Top" Width="50" MouseLeftButtonUp="mouse_callback"/>
Хорошо. Может тогда присвоить полю Source напрямую bitmapImage? код не приложу, но в общем не получилось. Хотя этот пример отлично работает
C#
1
2
3
4
5
6
7
Image myImage3 = new Image();
BitmapImage bi3 = new BitmapImage();
bi3.BeginInit();
bi3.UriSource = new Uri("smiley_stackpanel.PNG", UriKind.Relative);
bi3.EndInit();
myImage3.Stretch = Stretch.Fill;
myImage3.Source = bi3;
Но тут дело в том что нужно самому, допустим, в обработчике прерывания, менять изображение вызвавшего объекта image . Но мне- то надо привязать source к массиву , допустим string, из c#. Ну и собственно вопросы; на какой тип данных из c# можно ссылаться, если я не хочу жестко прописывать путь к картинке в xaml? И если с этим решится, то как лучше всего сделать binding в таком случае, точнее, как это сделает матерый в этом деле программист.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2019, 21:54
Ответы с готовыми решениями:

Манипуляции с Image.Source
Создаю новый компонент, наследуется от System.Windows.Controls.Image. В нём в виде списка элементов System.Windows.Controls.Image хранятся...

Image source binding и INotifyPropertyChanged
Пусть имеется изображение &lt;Image x:Name=&quot;p1g&quot; Source=&quot;{Binding player1.PField.Goalkeeper, Converter={Binding ImageConverter}}&quot;&gt; ...

Абсолютная адресация для Image.Source
Уважаемые Гуру! Код xaml: &lt;Image Source=&quot;{Binding itemImage, Mode=TwoWay}&quot;/&gt; Во ViewModel код с относительной адресацией itemImage...

23
0 / 0 / 0
Регистрация: 19.09.2018
Сообщений: 16
12.04.2019, 15:08  [ТС]
Студворк — интернет-сервис помощи студентам
Вот если взять последний пример. Отлично работает. Там есть делегат
C#
1
    public ImageSource Picture  => dictEnumImage[SelectFigure];
когда происходит его вызов, он возвращает BitmapImage из Dictionary dictEnumImage. А индекс в виде SelectFigure запускает
C#
1
2
3
4
5
6
set
            {
                _selectFigure = value;
                OnPropertyChanged();
                OnPropertyChanged("IndexImage Picture");
            }
Но вот я не могу придумать как сделать так, чтобы был массив ImageSource, и при вызове какого то отдельного элемента массива , запускалась OnPropertyChanged с переданной внее строкой с именем элемента массива. Я так понимаю , туда должно передаваться что-то типа "Picture[0]"?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.04.2019, 16:23
Цитата Сообщение от iahve1991 Посмотреть сообщение
Вот если взять последний пример.... Там есть делегат
Это не делегат. Это упрощённое объявление свойства только для чтения.

Цитата Сообщение от iahve1991 Посмотреть сообщение
Но вот я не могу придумать как сделать так, чтобы был массив ImageSource, и при вызове какого то отдельного элемента массива , запускалась OnPropertyChanged с переданной внее строкой с именем элемента массива. Я так понимаю , туда должно передаваться что-то типа "Picture[0]"?
Не понял...
Подробнее пожалуйста.
0
0 / 0 / 0
Регистрация: 19.09.2018
Сообщений: 16
12.04.2019, 16:48  [ТС]
Для того, чтобы view получил изменения, нужно вызвать функцию OnPropertyChanged . В аргументы передать имя переменной в формате string. Правильно? Но как мне передавать имя, если у меня есть массив значений, и на каждое значение имя будет свое.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
12.04.2019, 17:12
Цитата Сообщение от iahve1991 Посмотреть сообщение
Но как мне передавать имя, если у меня есть массив значений, и на каждое значение имя будет свое.
Сейчас пример накидаю.

Добавлено через 19 минут
Пример с одномерным списком.
Для двумерного надо делать или вложенность списков, или использовать DataGrid с расширением DataGrid2D
Классы VM
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    public class ImageArrVM : OnPropertyChangedClass
    {
        private ObservableCollection<ImageArrEnumtItem> _imageArr = new ObservableCollection<ImageArrEnumtItem>();
        private ImageArrEnumtItem _selectedImageItem;
        private RelayCommand _addImageItemCommand;
 
        public ObservableCollection<ImageArrEnumtItem> ImageArr { get => _imageArr; set { _imageArr = value; OnPropertyChanged(); } }
        public ImageArrEnumtItem SelectedImageItem { get => _selectedImageItem; set { _selectedImageItem = value; OnPropertyChanged(); } }
        public RelayCommand AddImageItemCommand 
            => _addImageItemCommand 
            ?? (_addImageItemCommand = new RelayCommand((x) => ImageArr.Add(new ImageArrEnumtItem() { SelectFigure=FigureEnum.None})));
 
    }
 
    public class ImageArrEnumtItem : OnPropertyChangedClass
    {
        private static Dictionary<FigureEnum, ImageSource> dictEnumImage = new Dictionary<FigureEnum, ImageSource>()
        {
            {FigureEnum.None, null },
            {FigureEnum.Up, new BitmapImage(new Uri( "/Resources/Стрелка Вверх.png", UriKind.Relative)) },
            {FigureEnum.Right, new BitmapImage(new Uri("Resources/Стрелка Вправо.png", UriKind.Relative)) },
            {FigureEnum.Down, new BitmapImage(new Uri("Resources/Стрелка Вниз.png", UriKind.Relative)) },
            {FigureEnum.Left, new BitmapImage(new Uri("Resources/Стрелка Влево.png", UriKind.Relative)) },
        };
        private static IEnumerable<FigureEnum> s_figures = Enum.GetValues(typeof(FigureEnum)).Cast<FigureEnum>();
        private FigureEnum _selectFigure;
 
        public FigureEnum SelectFigure { get => _selectFigure; set { _selectFigure = value; OnPropertyChanged(); OnPropertyChanged("Picture"); } }
        public IEnumerable<FigureEnum> Figures => s_figures;
        public ImageSource Picture => dictEnumImage[SelectFigure];
    }
View
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.DataContext>
            <local:ImageArrVM>
                <local:ImageArrVM.ImageArr>
                    <local:ImageArrEnumtItem SelectFigure="None"/>
                    <local:ImageArrEnumtItem SelectFigure="Up"/>
                    <local:ImageArrEnumtItem SelectFigure="Down"/>
                </local:ImageArrVM.ImageArr>
            </local:ImageArrVM>
        </Grid.DataContext>
        <StackPanel>
            <TextBlock Text="Коллекция элементов"/>
            <ListBox ItemsSource="{Binding ImageArr}" 
                     SelectedItem="{Binding SelectedImageItem}" 
                     SelectedIndex="1"
                     DisplayMemberPath="SelectFigure"/>
            <Button Content="Добавить элемент" Command="{Binding AddImageItemCommand, Mode=OneWay}"/>
            <Border DataContext="{Binding SelectedImageItem}" Margin="10" BorderThickness="1" BorderBrush="LightBlue">
                <StackPanel>
                    <TextBlock Text="Выделенный элемент"/>
                    <ComboBox x:Name="comboBox" ItemsSource="{Binding Figures}" SelectedItem="{Binding SelectFigure}"/>
                    <Border Height="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}" 
                           Width="{Binding ActualWidth, ElementName=comboBox, Mode=OneWay}" >
                        <Image Source="{Binding Picture}"/>
                    </Border>
                </StackPanel>
            </Border>
        </StackPanel>
        <ListBox Grid.Column="1" ItemsSource="{Binding ImageArr}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="{x:Type local:ImageArrEnumtItem}">
                    <Border BorderBrush="LightGray" BorderThickness="2">
                        <Image Source="{Binding Picture, Mode=OneWay}" Width="30" Height="30"/>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2019, 17:12

Обновить Image.Source из другого потока
Есть Image. Есть метод Render(), который долго выполняется и возвращает WriteableBitmap. Необходимо периодически обновлять Image.Source,...

Image Source не меняется после добавления изображения
Добрый всем день. Возникла проблема в отображении в image. После загрузки картинки в image, картинка не меняется, при выборе другого...

Не могу указать путь к изображению (Image.Source)
Кидаю на форму Image. Иду в источник и добавляю туда изображение, но нажимая ОК мне выдается такая ошибка(см. вложение)

Почему не запускается конвертер для Image Source?
Храню картинки в MSSQL базе (varbinary(MAX)). В датагриде показываю вложенное меню в котором есть Image. Пытаюсь забиндить картинку в...

Анимация Image.Source: плавная смена изображений
Всем привет! Подскажите пожалуйста, есть ли анимация, которая будет плавно менять один Image.Source на другой? И чтобы это делалось не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru