【发布时间】:2015-07-22 23:19:45
【问题描述】:
我有大量图片需要加载到我的 wpf 应用程序中。我用 BackgroundWorker 尝试过,但它无法创建显示图像的切换按钮。
有没有更好的方法来加载大量图像?它们必须是可选择的,因为用户可以选择图像。
到目前为止,这是我的一些代码:
<WrapPanel Name="mFolderImages">
<ToggleButton Width="150" Margin="5" Style="{StaticResource ImageList}">
<ToggleButton.Content>
<Image Source="/Managment;component/images/example.png" />
</ToggleButton.Content>
</ToggleButton>
</WrapPanel>
private void GetFolderImagesThreadFinished(object sender, RunWorkerCompletedEventArgs e) {
if (e.Result != null && e.Result is List<BitmapImage>) {
List<BitmapImage> images = (List<BitmapImage>)e.Result;
foreach (var image in images) {
Image img = new Image();
img.Source = image;
img.Margin = new Thickness(5);
ToggleButton btn = new ToggleButton();
btn.Content = img;
btn.Width = 150;
btn.Margin = new Thickness(5);
btn.IsEnabled = true;
btn.Click += ChangeSelectedImage;
btn.Style = this.FindResource("ImageList") as Style;
mFolderImages.Children.Add(btn);
}
}
mProgress.Visibility = Visibility.Collapsed;
mFolderImages.IsEnabled = true;
}
private void GetFolderImagesThread(object sender, DoWorkEventArgs e) {
string imagePath = Config.GetValue("ImagePath");
if (!Directory.Exists(imagePath)) return;
string[] files = Directory.GetFiles(imagePath);
int progress = 0;
List<BitmapImage> images = new List<BitmapImage>();
foreach(var file in files) {
if (file.EndsWith(".jpg") || file.EndsWith(".png")) {
try {
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.UriSource = new Uri(file, UriKind.Absolute);
bmp.EndInit();
bmp.Freeze();
images.Add(bmp);
} catch (Exception ex) {
Console.Write(ex.Message);
}
}
++progress;
mThread.ReportProgress((int)((progress / (float)files.Length) * 100));
}
e.Result = images;
}
【问题讨论】:
-
没有看过你的任何代码就很难说。
-
@Clemens 添加了一些代码
-
@VitorM.Barbosa 这不是问题,它显示它们阻止了用户界面。
-
您应该改用 ListBox,并将其 ItemsSource 属性绑定到图像文件路径的集合。在 ListBox 的 ItemTemplate 中,使用 Image 控件并将其 Source 属性绑定到文件路径,如
<Image Source="{Binding}"/>。所有加载都将由 WPF BitmapFrame 类异步完成,ImageSourceConverter 在内部使用该类,该类自动将字符串转换为 ImageSource。这种方法还可以从虚拟化中受益,即 ListBox 项目在滚动到视图中之前不会被加载。
标签: c# wpf multithreading