I would use a ListView
and an ObservableCollection<string>
in ViewModel. The ObservableCollection<string>
contains a dynamic list of paths to the images. Be sure that the Build Action of the images is set to Resource. Then within the Background Property of Window place an ImageBrush where you bind the Source Property to the SelectedItem Property of ListView
. The path strings of images follows a scheme you can find here: https://learn.microsoft.com/en-us/dotnet/framework/wpf/app-development/pack-uris-in-wpf
As desired (Images are BuildAction to Resource and copy if newer):
MainWindow.xaml
<Window x:Class="WinTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WinTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:TestViewModel x:Key="viewModel"/>
<local:ImageConverter x:Key="converter"/>
</Window.Resources>
<Window.DataContext>
<Binding Source="{StaticResource viewModel}" IsAsync="True"/>
</Window.DataContext>
<Window.Background>
<ImageBrush ImageSource="{Binding SelectedImagePath, Converter={StaticResource converter}}"/>
</Window.Background>
<Grid Background="Transparent">
<ListView Background="Transparent" SelectedValue="{Binding SelectedImagePath, Mode=TwoWay}" ItemsSource="{Binding PathList}"/>
</Grid>
</Window>
TestViewModel.cs (Collection can used as string or Uri list. You have to instanciate a new Uri in Converter from value if you use strings)
public class TestViewModel : BasePropertyChangeNotification
{
public ObservableCollection<Uri> PathList
{
get;
private set;
}
public Uri SelectedImagePath
{
get { return this.selectedImagePath; }
set { this.SetProperty(ref this.selectedImagePath, value); }
}
private Uri selectedImagePath = new Uri("pack://application:,,,/Images/img1.jpg", UriKind.RelativeOrAbsolute);
public TestViewModel()
{
this.PathList = new ObservableCollection<Uri>
{
new Uri("pack://application:,,,/Images/img1.jpg", UriKind.RelativeOrAbsolute),
new Uri("pack://application:,,,/Images/img2.jpg", UriKind.RelativeOrAbsolute),
new Uri("pack://application:,,,/Images/img3.jpg", UriKind.RelativeOrAbsolute),
new Uri("pack://application:,,,/Images/img4.jpg", UriKind.RelativeOrAbsolute),
new Uri("pack://application:,,,/Images/img13.jpg", UriKind.RelativeOrAbsolute)
};
}
}
ImageConverter.cs
public class ImageConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
return new BitmapImage(value as Uri);
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
That's all.