Я пытаюсь вызвать диалоговое окно диспетчера пользовательского интерфейса:
class DialogService : IDialogService
{
private readonly Dispatcher _dispatcher = Application.Current.Dispatcher;
public bool? Show(IDialogViewModel viewModel)
{
if (_dispatcher.CheckAccess())
{
var dialogWindow = new DialogWindow();
return dialogWindow.Show(viewModel);
}
else
{
Func<IDialogViewModel, bool?> func = Show;
return (bool?)_dispatcher.Invoke(func, viewModel);
}
}
}
Однако вызов Invoke
блокируется навсегда, а Show
никогда не вызывается в потоке пользовательского интерфейса ...
Использование BeginInvoke
не вариант: мне нужен результат немедленно, потому что я обрабатываю событие из удаленного объекта (используя .NET remoting)
Есть идеи?
ОБНОВЛЕНИЕ
Вот более полное описание проблемы:
У меня есть клиентское приложение, которое взаимодействует со службой Windows с помощью .NET Remoting.В какой-то момент клиент выполняет вызов службы для выполнения операции (этот вызов инициируется действием пользователя, в этом случае нажатием кнопки).Службе могут потребоваться учетные данные для выполнения операции: в этом случае она вызывает событие CredentialsNeeded
, обрабатываемое клиентом.Затем клиент показывает диалог, запрашивающий у пользователя учетные данные, и устанавливает соответствующие свойства в аргументах события.Когда обработчик события возвращается, служба использует учетные данные для завершения операции и возвращает управление клиенту.
Итак, когда я получаю событие, поток пользовательского интерфейса ожидает завершения операции в службесторона ... Я предполагаю, что это причина, по которой вызов Invoke
не обрабатывается, но как я могу обойти это?Могу ли я создать другой поток пользовательского интерфейса для отображения диалога?В WinForms я знаю, что мог бы запустить еще один насос сообщений с Application.Run
, но я не знаю, как сделать то же самое в WPF ...