在我的wpf应用程序中,我有一个菜单。当我点击菜单中的一个元素时,我会更改我的屏幕数据,这是一个相当长的过程。
我在使用此方法进行此类加载时尝试禁用主窗口:
private void SetNavigation(MainContentTypeEnum enumVal, int id, ICheckState vm)
{
var parent = Window.GetWindow(this);
var tmpCursor = parent.Cursor;
parent.Cursor = Cursors.Wait;
parent.IsEnabled = false;
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
bw.DoWork += (o, args) =>
{
try
{
Dispatcher d = args.Argument as Dispatcher;
d.Invoke(new Action(() =>
{
Navigation.Navigator.SetContol(enumVal, id, vm);
}));
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
};
bw.RunWorkerCompleted += (o, args) =>
{
parent.IsEnabled = true;
parent.Cursor = tmpCursor;
};
bw.RunWorkerAsync(Dispatcher.CurrentDispatcher);
}
此方法适用于第一次调用,表单已禁用,然后在加载数据时启用。但是在接下来的调用中,它不再起作用,一切都会冻结,直到操作完成。我尝试设置断点,正确命中并执行该方法。我不明白为什么它只能运作一次......
有你的想法吗?
提前致谢!
编辑:有点精确:此代码是usercontrol的一部分,这就是我使用Window.GetWindow(this);
Edit2:在调用调度程序之前设置Thread.Sleep(1000);
可以完成这项工作。我的猜测是parent.IsEnabled
指令执行得不够快......但为什么呢?
Edit3:做了一些时间后,我的数据检索非常快。似乎问题存在于绑定阶段。我将值设置为bound属性,并返回该方法。但是,UI之后仍然会冻结一段时间。