С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104

Закрытие окна WPF

18.05.2016, 15:15. Показов 3331. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Новое окно инициализируется следующим образом:
C#
1
2
                    Link Link = new Link();
                    Link.Show();
Новое окно закрываю так
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private Command _CloseW;
 
        public Command CloseW
        {
            get
            {
                return _CloseW ?? (_CloseW = new Command(async () =>
                {
                    await CloseViewModelAsync(true);
                }, () => true));
            }
        }
При закрытии окна, если в этом окне выполнялася команда
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        private Command linkToGroup;
 
        public Command LinkToGroup
        {
            get
            {
                return linkToGroup ?? (linkToGroup = new Command(() =>
                {
                    CreatingDBandTables.LinkSubtoGroup(group.Replace(" ", "___"), subject.Replace(" ", "???"), teacher.Replace(" ", "///"), Convert.ToInt32(amountOfLes));
                    subject = string.Empty;
                    teacher = string.Empty;
                    MessageBox.Show("Предмет добавлен!");
                }, () => true));
            }
        }
        string _teacher;
        public string teacher
        {
            get { return _teacher; }
            set { _teacher = value; RaisePropertyChanged("group"); }
        }
 
        string _subject;
        public string subject
        {
            get { return _subject; }
            set { _subject = value; if (value != null) { teachers = CreatingDBandTables.GetTeachers(value.Replace(" ", "???")); }
                else { teachers = CreatingDBandTables.GetTeachers(string.Empty); } RaisePropertyChanged("group"); }
        }
Активность прошлому View не возвращается (если открыты другие приложения - они попадают на первый план).
Как исправить?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2016, 15:15
Ответы с готовыми решениями:

Открыть WPF внутри другого WPF окна
Добрый день! Имеется задача: В WPF окне (назовем его MainWindow.xaml с привязкой к MainWindow.xaml.cs), имеется элемент Frame...

Вызов окошка WPF из другого окна WPF
Всем доброго времени суток. Подскажите пожалуйста как мне вызвать из главного окна WPF другую. Я тут искал, но нашел только как вызвать...

Закрытие дочерних окон в WPF приложении
Здравствуйте, люди добрые)) Возник такой вопрос, как говорится - помогите, чем сможете.. Моя задача такова: Я открываю родительское окно,...

14
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
18.05.2016, 17:07
Лучший ответ Сообщение было отмечено L1GhTUA как решение

Решение

Цитата Сообщение от L1GhTUA Посмотреть сообщение
Как исправить?
Например так
C#
1
2
3
4
5
6
Link Link = new Link();
            {
                Owner = this                   
            };
            Link.Closed += (s,e)=> ((Window)s).Owner.Activate();
            Link.Show();
0
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
18.05.2016, 18:58  [ТС]
golubyatnikovtv, я так понимаю ";" в первой строке лишняя?
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
18.05.2016, 19:36
L1GhTUA, абсолютно верно!
0
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
18.05.2016, 19:52  [ТС]
golubyatnikovtv, тогда такая проблемка
Миниатюры
Закрытие окна WPF  
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
18.05.2016, 20:01
L1GhTUA,
Что такое Link? Это модель представления или окно?

Owner у окна - это ссылка на родительское окно. Если Вы создаете окно в модели представления - это не по MVVM.
Если же Вас это не смущает, то в Вашу модель представления нужно передать ссылку на окно, в котором она показывается. Это окно и указывать в качестве Owner для Link.
0
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
18.05.2016, 21:01  [ТС]
golubyatnikovtv, Link - окно в данном случае. Чтобы реализовать это согласно MVVM, как я понял - нужно в модели представления LinkViewModel добавить метод Show с примерно таким содержанием:
C#
1
2
3
4
5
        public void Show()
        {
            Link Link = new Link();
            Link.Show();
        }
Верно? Как тогда быть?
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
18.05.2016, 21:55
Цитата Сообщение от L1GhTUA Посмотреть сообщение
нужно в модели представления LinkViewModel добавить метод Show с примерно таким содержанием
Не верно, MVVM, как религия, не позволяет модели представления иметь в себе ссылки на UI. Т.е. модель представления ничего не должна знать про UI. UI в данном случае - это Ваше окно Link.

Цитата Сообщение от L1GhTUA Посмотреть сообщение
Как тогда быть?
Есть один простой вариант - забыть про MVVM и писать так, как удобно. Т.е. передать окно в VM.

А также есть куча сложных.
Самый простой вариант из сложных - это сделать сервис типа IUiManager с методом Show(object vm) и передавать его в модели представлений, где необходимо открывать окна.
В реализации менеджера UiManager иметь ссылку на текущее окно и кучу регистраций пар {VmType, WindowType}, а в методе Show находить по типу переданного VM связанный с ним тип окна и активировать его, создавая при этом для нового окна новый UiManager.
Этот самый простой из сложных вариантов реализации может оказаться довольно громоздким, так как, скорее всего, Вам захочется помимо передачи VM в методе Show сделать еще передачу параметров отображения окна.
0
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
18.05.2016, 23:02  [ТС]
golubyatnikovtv,
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
в Вашу модель представления нужно передать ссылку на окно, в котором она показывается. Это окно и указывать в качестве Owner для Link.
Можно конкретнее, пожалуйста.
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
18.05.2016, 23:52
L1GhTUA, я не знаю как конкретней.
Что Вам не понятно?

Поэтапно:
1) в Вашу модель представления нужно передать ссылку на окно
2) Это окно и указывать в качестве Owner для Link.

Добавлено через 28 минут
Есть еще проще вариант - вынести ваш код по открытию окна в основное окно.
0
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
19.05.2016, 08:39  [ТС]
golubyatnikovtv, либо я что-то не так понял, либо не так реализовал. Итак, команда для открытия окна, где Groups - View к данной модели представления:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public Command LinkSubtoGroup
        {
            get
            {
                return linkSubtoGroup ?? (linkSubtoGroup = new Command(() =>
                {
                    Groups Groups = new Groups();
                    LinkViewModel LinkViewModel = new LinkViewModel();
                    LinkViewModel.Show(Groups);
 
                }, () => true));
            }
        }
Метод Show в LinkViewModel:
C#
1
2
3
4
5
6
7
        public void Show(Window window)
        {
            Link = new Link();
            Link.Show();
            Link.Owner = window;
            Link.Closed += (s, e) => ((Window)s).Owner.Activate();
        }
Полагаю, либо ошибка в объекте, что я передаю методу Show, либо вообще все не так)
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
19.05.2016, 08:45
L1GhTUA, и в итоге активация не происходит...

Вам не нужно создавать новое окно
C#
1
Groups Groups = new Groups();
Нужно получить ссылку на текущее окно, и его устанавливать в свойство Owner.
0
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
19.05.2016, 10:16  [ТС]
Цитата Сообщение от golubyatnikovtv Посмотреть сообщение
и в итоге активация не происходит...
Выбивает исключение при попытке назначить переданное окно Owner'ом. Говорит, что оно не было открыто. Ну это только подтверждает догадки о передаче не того объекта. Каким образом получить ссылку на View из модели представления?
0
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
19.05.2016, 11:07
Цитата Сообщение от L1GhTUA Посмотреть сообщение
Каким образом получить ссылку на View из модели представления?
Передать окно в конструктор модели представления
1
0 / 0 / 1
Регистрация: 19.11.2015
Сообщений: 104
19.05.2016, 11:18  [ТС]
golubyatnikovtv, спасибо большое)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2016, 11:18
Помогаю со студенческими работами здесь

Закрытие окна из другого файла
Имеются два окна, LoginRegisterWindow и MainWindow. В LoginRegisterWindow есть ContentControl в котором в зависимости от выбора...

Закрытие диалогового окна MVVM
Помогите пожалуйста разобраться, если кто-нибудь знает: Очень тяжело идет понимание WPF и MVVM. Решаю следующую задачу: Из...

Закрытие основного окна программы
Хочу что бы при нажатии кнопки закрывалось основное окно моей программы. Во втором окне сделал кнопку private void button1_Click(object...

Минимизация и закрытие основного окна вместе с диалоговым
Всем добрый день. Нужно сделать, чтобы основное окно минимизировалось и закрывалось вместе с диалоговым. Минимизацию я сделала таким...

Обновление окна wpf
Дорогие товарищи столкнулся с проблемой что изображения появляются только после создания нового окна, как этого избежать? Точнее как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru