/// <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(Тип));
        }
Exemple #2
0
        /// <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(владелец);
        }
Exemple #3
0
        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(задействуйОснПоток));
        }
Exemple #4
0
        /// <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);
                }
            }
        }