从另一个类和单独的线程更改WPF主窗口标签

iJa*_*Jay 8 wpf dispatcher mainwindow

我正在研究WPF应用程序.我有一个名为"Status_label"的标签MainWindow.xaml.我想从不同的类(signIn.cs)更改其内容.通常我能做到这一点

var mainWin = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow;
mainWin.status_lable.Content = "Irantha signed in";
Run Code Online (Sandbox Code Playgroud)

但我的问题是,当我试图通过signIn.cs类中的不同线程访问它时,它会给出一个错误:

The calling thread cannot access this object because a different thread owns it.
Run Code Online (Sandbox Code Playgroud)

我可以通过使用Dispatcher.Invoke(new Action(() =>{..........或其他方式解决这个问题吗?

编辑: 我将从不同的类调用此标签更改操作 - 以及单独的线程

MainWindow.xaml

<Label HorizontalAlignment="Left" Margin="14,312,0,0" Name="status_lable" Width="361"/>
Run Code Online (Sandbox Code Playgroud)

SignIn.cs

    internal void getStudentAttendence()
    {
        Thread captureFingerPrints = new Thread(startCapturing);
        captureFingerPrints.Start();
    }

void mySeparateThreadMethod()
{
    var mainWin = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow;
    mainWin.status_lable.Dispatcher.Invoke(new Action(()=> mainWin.status_lable.Content ="Irantha signed in"));
}
Run Code Online (Sandbox Code Playgroud)

line var mainWin返回错误The calling thread cannot access this object because a different thread owns it.

请指导我,

谢谢

iJa*_*Jay 23

我解决了我的问题,希望有人会需要这个.但不知道这是否是优化方式.

在我的mainWindow.xaml.cs中:

    public  MainWindow()
    {
      main = this;
    }

    internal static MainWindow main;
    internal string Status
    {
        get { return status_lable.Content.ToString(); }
        set { Dispatcher.Invoke(new Action(() => { status_lable.Content = value; })); }
    }
Run Code Online (Sandbox Code Playgroud)

来自我的SignIn.cs

 MainWindow.main.Status = "Irantha has signed in successfully";
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.您可以从此处找到更多详细信息,从另一个类和单独的线程更改WPF窗口标签内容

干杯!!