加载数据时禁用屏幕

时间:2012-03-15 14:53:51

标签: wpf navigation dispatcher

在我的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之后仍然会冻结一段时间。

0 个答案:

没有答案