C# 从MVVM/WPF中的BackgroundWorker更新位图
我正在尝试从BackgroundWorker线程更新UI中的BitmapImage。我对后台工作人员非常了解,知道如何设置他们,以及如何使用ObservableCollection更新后台工作人员的列表,但我很难更新图像 当我设定 目前看来是这样的:C# 从MVVM/WPF中的BackgroundWorker更新位图,c#,wpf,mvvm,bitmap,backgroundworker,C#,Wpf,Mvvm,Bitmap,Backgroundworker,我正在尝试从BackgroundWorker线程更新UI中的BitmapImage。我对后台工作人员非常了解,知道如何设置他们,以及如何使用ObservableCollection更新后台工作人员的列表,但我很难更新图像 当我设定 目前看来是这样的: public partial class MainWindow : Window { private ObservableCollection<int> myVar; public ObservableCollect
public partial class MainWindow : Window
{
private ObservableCollection<int> myVar;
public ObservableCollection<int> MyProperty
{
get { return myVar; }
set { myVar = value; }
}
BackgroundWorker bw;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
MyProperty = new ObservableCollection<int>();
bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerAsync();
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i < 10;i++)
{
MyProperty.Add(i);
}
}
}
Dispatcher.Invoke((Action)delegate() { /*update UI thread here*/ });
XAML:
像这样使用ObservableCollection:
public partial class MainWindow : Window
{
private ObservableCollection<int> myVar;
public ObservableCollection<int> MyProperty
{
get { return myVar; }
set { myVar = value; }
}
BackgroundWorker bw;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
MyProperty = new ObservableCollection<int>();
bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerAsync();
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i < 10;i++)
{
MyProperty.Add(i);
}
}
}
Dispatcher.Invoke((Action)delegate() { /*update UI thread here*/ });
公共部分类主窗口:窗口
{
私有可观测集合myVar;
公共可观测集合MyProperty
{
获取{return myVar;}
设置{myVar=value;}
}
背景工作者;
公共主窗口()
{
初始化组件();
this.DataContext=this;
MyProperty=新的ObservableCollection();
bw=新的BackgroundWorker();
bw.DoWork+=bw_DoWork;
RunWorkerAsync();
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i<10;i++)
{
添加(i);
}
}
}
和xaml:
<ListBox HorizontalAlignment="Left" ItemsSource="{Binding MyProperty}" Height="224" Margin="93,50,0,0" VerticalAlignment="Top" Width="321"/>
问题是您试图从后台线程更新UI元素。由于安全原因,您无法与从任何其他线程在UI线程上创建的元素交互。如果要从后台线程更新UI,请执行以下操作:
public partial class MainWindow : Window
{
private ObservableCollection<int> myVar;
public ObservableCollection<int> MyProperty
{
get { return myVar; }
set { myVar = value; }
}
BackgroundWorker bw;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
MyProperty = new ObservableCollection<int>();
bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerAsync();
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i < 10;i++)
{
MyProperty.Add(i);
}
}
}
Dispatcher.Invoke((Action)delegate() { /*update UI thread here*/ });
此方法将创建允许您与UI线程对话的桥接器。查看stackoverflow线程,其中有更多示例
祝你好运我在最初的帖子中简要提到了它,但我知道如何使用ObservableCollection更新列表。因为它只需要一个对象而不需要一个列表/集合,所以可以使用它们来更新图像源绑定吗?这非常有效,谢谢。我现在真的明白调度员是怎么工作的了。Application.Current.Dispatcher.Invoke(()=>ImageSource=UpdateImage());