昨天我遇到了如何从异步方法回调更新 c# wpf 中的 gui 的问题
没有人帮助我,但我发现了一些有用的东西:
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(delegate
{
this.TargetWindow = new MessageListsWindow();
}));
th.SetApartmentState(System.Threading.ApartmentState.STA);
th.Start();
今天换窗口有问题,因为那个操作有错误:
跨线程操作无效:控件从创建它的线程以外的线程访问。
当我从同步方法调用它时,代码可以工作,但是当我异步调用它时它不会。
换窗方法:
public void NavigateToWindow(CustomWindow targetWindow)
{
CustomWindow currentWindow = findVisualParent<CustomWindow>(this);
if(currentWindow != null)
{
currentWindow.Close();
//targetWindow.Dispatcher.Invoke(new Action(() => targetWindow.Show()));
//Application.Current.Dispatcher.BeginInvoke(new Action(() => targetWindow.Show()));
//targetWindow.Dispatcher.Invoke(new Action(() => targetWindow.Show()));
//currentWindow.Dispatcher.Invoke(new Action(() => targetWindow.Show()));
targetWindow.Show();
}
}
private T findVisualParent<T>(DependencyObject child)
where T : DependencyObject
{
// get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
// we’ve reached the end of the tree
if (parentObject == null) return null;
// check if the parent matches the type we’re looking for
T parent = parentObject as T;
if (parent != null)
{
return parent;
}
else
{
// use recursion to proceed with next level
return findVisualParent<T>(parentObject);
}
注释代码是我尝试过的,未注释的行适用于同步方法。我读过在 WPF 中这些问题由 dispatcher.invoke() 处理。在我使用的窗口控制表单中:
this.Invoke((MethodInvoker)delegate
{
//changing UI
});
我不知道该怎么做才能让它工作。任何帮助,将不胜感激。