Отключить экран во время загрузки данных - PullRequest
0 голосов
/ 15 марта 2012

В моем приложении 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: после некоторого времени мой поиск данных происходит довольно быстро. Похоже, что проблема существует на этапе связывания. Я устанавливаю значение для привязанного свойства, и метод возвращает. Тем не менее, интерфейс все еще завис на мгновение после этого.

...