/// <summary> /// Возвращает текущее окно верхнего уровня, от которого следует строить /// появляющиеся окна диалога. /// </summary> private Window GetCurrentTopOwnerWindow() { Window владелец = null; try { Func <Window> задействуйОснПоток = delegate { return(Application.Current.MainWindow); }; владелец = (Window)WindowServices.InvokeOnUIThread(задействуйОснПоток); } catch (InvalidOperationException) { return(null); } if (стекОконДиалога.Count > 0) { владелец = стекОконДиалога[стекОконДиалога.Count - 1]; } return(владелец); }
private MessageBoxResult ShowMessageBox(Window окноВладелец, string сообщение, string заголовок, MessageBoxButton кнопка, MessageBoxImage иконка) // СТ 09.11.2016 { Func <MessageBoxResult> задействуйОснПоток = delegate { MessageBoxResult результатДиалога; if (окноВладелец != null) { результатДиалога = MessageBox.Show(окноВладелец, сообщение, заголовок, кнопка, иконка); } else { результатДиалога = MessageBox.Show(сообщение, заголовок, кнопка, иконка); } return(результатДиалога); }; return((MessageBoxResult)WindowServices.InvokeOnUIThread(задействуйОснПоток)); }
/// <summary> /// Показать окно в режиме диалога. /// </summary> public bool?ПоказатьОкноДиалога(Window window, object dataContext) { Window owner = GetCurrentTopOwnerWindow(); // помещаем в стек окно которое сейчас будет отображено if (owner != null) { this.стекОконДиалога.Add(window); } // выполнение диалога try { Func <bool?> func = delegate { return(ShowDialogWithContext(window, dataContext, owner)); }; return((bool?)WindowServices.InvokeOnUIThread(func)); } finally { // всегда убираем из стека отработанное окно if (owner != null) { this.стекОконДиалога.Remove(window); } } }