我想基于按钮单击来更改或“滚动”主窗口的不同背景图像。不同背景的数量将是动态的,并且将基于特定文件夹中图像的数量。因此,每次程序加载时,都有不同数量的背景可以滚动浏览。
我还希望能够返回到上一个背景图像,因此整个过程就像旋转木马一样。示例:程序加载并且A.jpg作为背景图像加载。我单击“向右”按钮,A.jpg向左滑动,然后B.jpg从右向滑动,成为新的背景图像。我再次单击“右”,C.jpg从右滑入。然后,我单击“左”,然后B.jpg从左侧滑回,等等。
希望这是有道理的。我对XAML和WPF还是很陌生,所以只想弄清楚我将如何去做。任何帮助或指导将不胜感激。谢谢!
答案 0 :(得分:1)
我会在ViewModel中使用ListView
和ObservableCollection<string>
。 ObservableCollection<string>
包含图像路径的动态列表。确保将图像的“生成操作”设置为“资源”。然后在Window的Background属性中放置一个ImageBrush,在其中将Source属性绑定到ListView
的SelectedItem属性。图片的路径字符串遵循以下方案:https://docs.microsoft.com/en-us/dotnet/framework/wpf/app-development/pack-uris-in-wpf
根据需要(图像是对资源的BuildAction,如果更新则将其复制):
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(集合可以用作字符串或Uri列表。如果使用字符串,则必须从值实例化Converter中的新Uri)
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;
}
}
仅此而已。
答案 1 :(得分:0)
这就是您可以执行的操作!我已经测试过了。您可以为转盘式效果应用动画。
public MainWindow()
{
InitializeComponent();
myImagesList = new List<ImageBrush>();
ImageBrush myBrush1 = new ImageBrush(new BitmapImage(new Uri(@"C:\Users\Abdul Rehman\Desktop\1-Rao Hammas Folder\MY PROJECTS\StackOverFlowSolutions\StackOverFlowSolutions\Images\Capture.JPG")));
ImageBrush myBrush2 = new ImageBrush(new BitmapImage(new Uri(@"C:\Users\Abdul Rehman\\Desktop\1-Rao Hammas Folder\MY PROJECTS\StackOverFlowSolutions\\StackOverFlowSolutions\Images\\Apps-Dialog-Close-icon.png")));
ImageBrush myBrush3 = new ImageBrush(new BitmapImage(new Uri(@"C:\Users\Abdul Rehman\\Desktop\1-Rao Hammas Folder\MY PROJECTS\StackOverFlowSolutions\\StackOverFlowSolutions\Images\\Capture.JPG")));
ImageBrush myBrush4 = new ImageBrush(new BitmapImage(new Uri(@"C:\Users\Abdul Rehman\\Desktop\1-Rao Hammas Folder\MY PROJECTS\StackOverFlowSolutions\\StackOverFlowSolutions\Images\\Capture.JPG")));
ImageBrush myBrush5 = new ImageBrush(new BitmapImage(new Uri(@"C:\Users\Abdul Rehman\\Desktop\1-Rao Hammas Folder\MY PROJECTS\StackOverFlowSolutions\\StackOverFlowSolutions\Images\\Capture.JPG")));
myImagesList.Add(myBrush1);
myImagesList.Add(myBrush2);
myImagesList.Add(myBrush3);
myImagesList.Add(myBrush4);
myImagesList.Add(myBrush5);
MainWin.Background = myImagesList[index];
}
private int index = 0;
private List<ImageBrush> myImagesList;
private void NextBtn_Click(object sender, RoutedEventArgs e)
{
index++;
MainWin.Background = myImagesList[index];
}
private void PrevBtn_Click(object sender, RoutedEventArgs e)
{
index--;
MainWin.Background = myImagesList[index];
}
XAML
<Window x:Class="StackOverFlowSolutions.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="MainWin"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Name="NextBtn" Width="30" Height="20" Click="NextBtn_Click">Next</Button>
<Button Name="PrevBtn" Width="30" Height="20" Margin="297,111,176,180" Click="PrevBtn_Click">Prev</Button>
</Grid>
</Window>