【发布时间】:2011-03-30 15:26:26
【问题描述】:
我使用浏览文件对话框来允许用户选择多个图像。如果选择了很多图像,正如预期的那样,它需要一些时间。下面是我如何处理所选图像的示例。我遍历图像的文件路径并创建用户控件的实例,用户控件有一个图像控件和一些其他控件。我创建此控件的实例,然后将其添加到在关联窗口 xaml 文件中创建的现有 stackPanel。下面的示例工作正常,但我试图更好地理解 BackGroundWorker,我了解了如何设置它的基础知识,它的事件,并传回一个可以更新进度条的值,但是因为我的循环需要下面的正常运行时间将用户控件实例添加到现有的 stackPanel,它不会工作,在不同的线程中。 BackGroundWorker 是否适用于这样的示例?如果是这样,那么更新线程外的 ui(我的堆栈面板)的最佳方法是什么。我对 wpf 还很陌生,除了测试它只是用一个 int 值更新进度之外,从未使用过 BackGroundWorker,所以我希望这个问题是有道理的,如果我偏离目标,请告诉我。感谢您的任何想法。
我现在的做法示例,效果很好。
protected void myMethod(string[] fileNames) {
MyUserControl uc;
foreach (String imagePath in fileNames) {
uc = new MyUserControl();
uc.setImage(imagePath);
stackPanel.Children.Add(uc);
progressBar.Value = ++counter;
progressBar.Refresh();
}
}
在这个类下面我有这个,所以我可以刷新进度条:
public static class extensionRefresh {
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement) {
uiElement.Dispatcher.Invoke(DispatcherPriority.Background, EmptyDelegate);
}
}
【问题讨论】:
标签: wpf progress-bar backgroundworker invoke