Как добавить изображения из Resources.resx в выпадающий список - PullRequest
1 голос
/ 20 июня 2019

Я много искал, но не могу получить то, что хочу.Мне нужно заполнить поле со списком изображений (114 изображений, встроенных в Resources.resx).

Я просто получаю список, а не изображения.Вот мой код.

ResourceSet rsrcSet =MyProject.Properties.Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);

            List<object> images = new List<object>();

            foreach (DictionaryEntry entry in rsrcSet)
            {
                //String name = entry.Key.ToString();
                //Object resource = entry.Value;
                images.Add( Don't know what will be here? );
            }

            var comboBox = sender as ComboBox;

            comboBox.ItemsSource = images;

и мой XAML

                <ComboBox HorizontalAlignment="Left" Grid.Column="0" Grid.Row="0" VerticalAlignment="Top" Width="320" Loaded="ComboBox_Loaded" SelectionChanged="ComboBox_SelectionChanged"/>

1 Ответ

1 голос
/ 20 июня 2019

Это самый простой в использовании шаблон элемента. Для этого мы определяем DataTemplate с помощью DataType String и устанавливаем его на ComboBox.ItemTemplate. Чтобы использовать String в XAML, нам нужно сослаться на сборку и пространство имен xmlns:system="clr-namespace:System;assembly=mscorlib". Для привязки мы используем ObservableCollection<string>, который содержит относительные пути к вашим изображениям:

Посмотреть модель:

public class ViewModel : INotifyPropertyChanged
{
    public TestViewModel()
    {
      this.ImageSources = new ObservableCollection<string>() { @"Resources\Icons\image.png" };      
    }

    /// <summary>
    /// Event fired whenever a child property changes its value.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Method called to fire a <see cref="PropertyChanged"/> event.
    /// </summary>
    /// <param name="propertyName"> The property name. </param>
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
      this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private ObservableCollection<string> imageSources;   
    public ObservableCollection<string> ImageSources
    {
      get => this.imageSources;
      set 
      { 
        this.imageSources = value; 
        OnPropertyChanged();
      }
    }
}

Xaml:

<Window x:Class="MainWindow" 
    xmlns:system="clr-namespace:System;assembly=mscorlib">
  <Window.DataContext>
     <viewModels:ViewModel />
  </Window.DataContext>
  <Window.Resources>
      <DataTemplate x:Key="ComboBoxItemTemplate" DataType="system:String">
            <Image Source="{Binding}" Height="100" Width="100"/>
      </DataTemplate>
  </Window.Resources>
  <Grid>
    <StackPanel>
      <ComboBox ItemTemplate="{StaticResource ComboBoxItemTemplate}"
                ItemsSource="{Binding ImageSources}" />
    </StackPanel>
  </Grid>
</Window>

Чтобы это работало, ваш словарь должен содержать относительные пути к изображениям. Если нет, вы должны конвертировать. Таким образом, вместо инициализации ObservableCollection в конструкторе, как в примере, вы можете переместить инициализацию в другое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...