Wpf 加载数据时禁用屏幕
在我的wpf应用程序中,我有一个菜单。当我点击菜单的一个元素时,我改变了我的屏幕数据,这是一个相当长的过程 我尝试使用以下方法在加载时禁用主窗口:Wpf 加载数据时禁用屏幕,wpf,navigation,dispatcher,Wpf,Navigation,Dispatcher,在我的wpf应用程序中,我有一个菜单。当我点击菜单的一个元素时,我改变了我的屏幕数据,这是一个相当长的过程 我尝试使用以下方法在加载时禁用主窗口: private void SetNavigation(MainContentTypeEnum enumVal, int id, ICheckState vm) { var parent = Window.GetWindow(this); var tmpCursor = parent.Cursor; parent.Cursor
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:设置线程睡眠(1000)代码>就在调用分派器之前执行此任务。我的猜测是parent.IsEnabled
指令执行速度不够快。。。但是为什么呢
编辑3:我已经做了一些计时,我的数据检索相当快。这个问题似乎存在于绑定阶段。我将该值设置为绑定属性,然后该方法返回。但是,用户界面在那之后仍然冻结了片刻。一个好主意可能是放置一个繁忙的控件/指示器,而不是启用/禁用我已经尝试过了,但得到了相同的结果。BusyIndicator
(来自扩展工具包)仅在我使用Thread.Sleep(…)
…时显示Navigator.Navigator.SetContol
的具体功能是什么?它在视图模型中加载数据,创建视图(=usercontrol)并将此视图分配给ContentControl
元素。您给它使用什么Dispatcher
对象?如果是UI调度程序,则在运行Navigation.Navigator.SetContol
方法时冻结UI。