/// <summary> /// Возвращает новый объект образа для данного объекта модели (контекста данных). /// Чтобы образ для контекста нашелся, необходимо чтобы для класса контекста имя /// которого МодельXXX существовал класс ОбразXXX который является подклассом Window/Control. /// </summary> public static Тип СделатьОбразДляМодели <Тип>(object dataContext) { if (dataContext == null) { ThrowBadContext(dataContext, "контекст данных = null", null); } // проверяем префикс модели Type type = dataContext.GetType(); string modelPrefix = "Модель"; if (!type.Name.StartsWith(modelPrefix)) { ThrowBadContext(dataContext, "Имя класса контекста данных должно начинаться строкой [" + modelPrefix + "]", null); } // собираем имя класса образа в том же простарнстве имен как и контекст данных string viewName = "Образ" + type.Name.Substring(modelPrefix.Length); string viewTypeName = type.Namespace + "." + viewName; // ищем тип образа Type viewType = null; try { viewType = type.Assembly.GetType(viewTypeName); } catch (Exception e) { ThrowBadContext(dataContext, "Невозможно найти класс: " + viewTypeName, e); } if (viewType == null) { ThrowBadContext(dataContext, "Не существует класс образа c именем: " + viewTypeName, null); } // создаем объект образа object obj = null; try { obj = WindowServices.CreateInstanceOnUIThread(viewType); } catch (Exception e) { ThrowBadContext(dataContext, "Невозможно создать объект типа " + viewTypeName, e); } // объект должен быть нужного типа if (obj is Тип) { return((Тип)obj); } ThrowBadContext(dataContext, "Тип " + viewTypeName + " не является подклассом " + typeof(Тип).FullName, null); return(default(Тип)); }
/// <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); } } }