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