2014-04-10 5 views
0

У меня есть MainWindow, в котором содержится экземпляр DemoUI (UserControl).WPF InvalidOperationException Получение справки MainWindow

Из экземпляра класса под названием DemoModule у меня есть ссылка на DemoUI, который я называю _demoUI.

Когда я пытаюсь получить ссылку на MainWindow изнутри DemoModule использованием

var parentWindow = Window.GetWindow(_demoUI);

Я получаю эту InvalidOperationException:

The calling thread cannot access this object because a different thread owns it.

В конце концов, я хочу, чтобы иметь возможность обновить значение индикатора выполнения MainWindow, использующее его Диспетчер, следующим образом:

var progressBar = parentWindow.FindName("ProgressBar") as ProgressBar; 

progressBar.Dispatcher.Invoke(DispatcherPriority.Normal, 
    new DispatcherOperationCallback(o => { 
     progressBar.Value = Progress = args.Current; 
     return null; 
    }), null); 

Update 1

public void OnProgressChanged(object sender, ProgressChangedEventArgs args) 
{ 
    Progress = Convert.ToInt32(args.Current * 100); 
    var progressBar = Application.Current.MainWindow.FindName("ProgressBar") as ProgressBar; 
    if (progressBar != null) 
     progressBar.Value = Progress; 
} 
+0

Каков ваш вопрос? –

+0

Мой вопрос, очевидно, об исключении. –

ответ

0

Из кода вы включаете здесь не кажется, что вам нужно, чтобы получить ссылку ProgressBar для того, чтобы обновить ProgressBar на вашем _demoUI? Есть ли еще один ProgressBar в MainWindow? Независимо от того, вы можете использовать ссылку _demoUI, чтобы добраться до диспетчера.

_demoUI.Dispatcher.Invoke(DispatcherPriority.Normal, 
    new DispatcherOperationCallback(o => { 
     _demoUI.ProgressBar.Value = Progress = args.Current; 
     return null; 
    }), null); 

Или

_demoUI.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
    new DispatcherOperationCallback(o => { 
     var window = Window.GetWindow(_demoUI); 
     //do what you need to with the window here. 


    }), null); 
+0

Да, есть только один ProgressBar (я обновил код в своем вопросе). Кроме того, нет 'Window.GetParent()'. Если вы имеете в виду 'Window.GetWindow (_demoUI)', то это возвращает null. –

+0

Да, извините, моя ошибка. Window.GetWindow. Когда вы это называете? Он уже был добавлен в родительское окно? Можете ли вы изменить его на BeginInvoke и установить DispatcherPriority для фона? Или Вход, если фон слишком низкий приоритета? – Malaise

+0

Оказывается, что канал обратного вызова WCF работал в отдельном потоке. Я изменил это поведение, комментируя '[CallbackBehavior]', и теперь я также могу перейти на индикатор выполнения в главном окне, используя код в обновленном выше. Я не думаю, что часть WCF имела много общего с этим, но тем не менее это было интересно. –

Смежные вопросы