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窗口标签内容
干杯!!