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

在我的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:设置线程睡眠(1000)就在调用分派器之前执行此任务。我的猜测是
parent.IsEnabled
指令执行速度不够快。。。但是为什么呢



编辑3:我已经做了一些计时,我的数据检索相当快。这个问题似乎存在于绑定阶段。我将该值设置为绑定属性,然后该方法返回。但是,用户界面在那之后仍然冻结了片刻。

一个好主意可能是放置一个繁忙的控件/指示器,而不是启用/禁用我已经尝试过了,但得到了相同的结果。
BusyIndicator
(来自扩展工具包)仅在我使用
Thread.Sleep(…)
…时显示
Navigator.Navigator.SetContol
的具体功能是什么?它在视图模型中加载数据,创建视图(=usercontrol)并将此视图分配给
ContentControl
元素。您给它使用什么
Dispatcher
对象?如果是UI调度程序,则在运行
Navigation.Navigator.SetContol
方法时冻结UI。