Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从MVVM/WPF中的BackgroundWorker更新位图_C#_Wpf_Mvvm_Bitmap_Backgroundworker - Fatal编程技术网

C# 从MVVM/WPF中的BackgroundWorker更新位图

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

我正在尝试从BackgroundWorker线程更新UI中的BitmapImage。我对后台工作人员非常了解,知道如何设置他们,以及如何使用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*/ });
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());