В моем приложении я загружаю DocumentViewer для предварительного просмотра и печати. Поскольку загрузка может занять до нескольких секунд, я хотел бы отобразить ProgressDialog. Логика такова: покажите ProgressDialog, создайте и покажите DocumentViewer, закройте ProgressDialog.Как закрыть MahApps ProgressDialog, не теряя при этом внимания на контроле над детьми?
Проблема заключается в том, что при закрытии диалогового окна фокус возвращается к MainWindow, а не к окну DocumentViewer. Я думаю, это потому, что диалог CloseAsync(). Я попытался вызвать функции Focus(), Activate(), Show(), установив TopMost = true, установив владельца дочернего окна, но, хотя окно отображается перед родителем, фокус все еще возвращается к родительскому , Единственный способ восстановить фокус для ребенка - это сделать программный щелчок внутри дочернего окна в событии ProgressDialogController.Closed, но недостатком является то, что есть уродливый переход (сначала изначально появляется ребенок, потом родительский, потом ребенок еще раз).
Может быть закрытАнсинк()? Или как закрыть MahApps ProgressDialog, не теряя при этом внимания детскому контролю?
UPDATE
Я использую MahApps 1.3.0.157. Код, я использую в ViewModel:
public async void PrintLogExecute()
{
await DialogService.ShowProgressDialog(Properties.Resources.loading_message_box_title, Properties.Resources.loading_message_box_text);
ReportingClass.PrintDataGrid(LogEntries);
DialogService.CloseProgressDialog();
}
Класс DialogService:
static class DialogService
{
public static async Task ShowProgressDialog(string dialogTitle, string message)
{
var metroWindow = (GetMainWindow() as MetroWindow);
controller = await metroWindow.ShowProgressAsync(dialogTitle, message);
controller.SetIndeterminate();
}
public static void CloseProgressDialog()
{
controller.CloseAsync();
}
private static Window GetMainWindow()
{
return Application.Current.Windows[0];
}
}
При выполнении PrintLogExecute(), документ просмотрщик, во-первых появляется в передней части главного окна и сразу же после этого, когда Выполняя DialogService.CloseProgressDialog(), он переходит в фоновый режим. Как я уже сказал, единственный способ, которым я восстановил внимание к ребенку, - это сделать программный щелчок внутри дочернего окна в событии ProgressDialogController.Closed.
Спасибо за эту альтернативу. Однако я хотел бы использовать ProgressDialog. –