C# WPF между окнами [дубликат]
Это сообщение было исправлено и отправлено на проверку 9 месяцев назад , но повторное открытие сообщения провалилось:
Исходные причины закрытия не были исправлены
Как правильно создать окно, чтобы я могу к нему обращаться из других окон и классов? А то сделал так
public partial class App : Application
но в другом классе и окне использовать не могу. прошу пожалуйста дать прямое решение
Отслеживать
задан 7 апр 2023 в 6:52
51 6 6 бронзовых знаков
Учить MVVM, пример здесь: ru.stackoverflow.com/a/1222168/373567
7 апр 2023 в 7:07
А вообще я отвечал вам на прошлый вопрос, но вы так и не отреагировали на ответ совершенно никак, пришлось его удалить как бесполезный. Зачем тогда вы задаете вопросы, если даже не смотрите ответы?
7 апр 2023 в 7:31
возможно я нашел сам ответ и забил, извиняюсь
7 апр 2023 в 7:37
0
Сортировка: Сброс на вариант по умолчанию
- c#
- wpf
-
Важное на Мете
Связанные
Похожие
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как корректно реализовать переход между окнами wpf?
Условно два окна window1 и window2 и кнопка button которая позволяет переходить из window1 в window2
При нажатии на button в window1 открывается window2, после того как закрываю window2, в окне window1
больше не могу обратиться к window2, тк FarmWnd == null (null == null) добавил это условие чтобы при каждом нажатии
на button у пользователя не было возможности открывать n раз окно window2
private void AddFarm_Click(object sender, RoutedEventArgs e) < if (FarmWnd == null) < FarmWnd = new FarmWnd(); FarmWnd.Show(); >else < FarmWnd.Activate(); >>
- Вопрос задан 19 мар. 2023
- 126 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2

Роман @yarosroman Куратор тега C#
C# the best
У вас в коде ошибка, если FarmWnd==null, вы словите исключение в строке с Activate. И зачем FarmWnd присваивать null? сделайте свойство у окна и устанавливайте его, при необходимости, можно или нельзя открывать.
Ответ написан 20 мар. 2023
Maнул @Mikilian Автор вопроса
спасибо за ваш ответ, исключение не возникает
public static FarmWnd FarmWnd ;
private void AddFarm_Click(object sender, RoutedEventArgs e)
if (FarmWnd == null)
FarmWnd = new FarmWnd();
FarmWnd.Show();
>
else
FarmWnd.Activate();
>
>
Как переключаться между окнами без открытия и закрытия форм WPF?
Есть 2 формы. По нажатию на кнопку, расположенной на форме1 должно происходить переключение на форму2 без открытия этой формы и закрытия формы1, т.е. в 1-й форме происходит переключение между содержимым 2-ух форм.
Как это реализовать?
- Вопрос задан более двух лет назад
- 803 просмотра
4 комментария
Простой 4 комментария

Foggy Finder @FoggyFinder

Тебе нужно окно окно и 2 Page, и просто меняй контент и всё
SomeDeveloper @SomeDeveloper Автор вопроса
twobomb, пытаюсь, но не получается, мне нужно нажать на кнопку на page1, но если я использую метод OnClick на этой кнопке на Page1, то приложение вылетает, либо не запускается вовсе
MainWindow mainWindow = new MainWindow(); // Класс, где есть Frame private void btnInfo_Click(object sender, RoutedEventArgs e) < mainWindow.MainFrame.Navigate(new InfoPage()); // Изменяем Page по нажатии на кнопку >
Вот сам MainWindow
public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); MainFrame.Navigate(new MainPage()); >>
Я пытался сделать через гиперссылку, но мне нужно нажимать на кнопку. Попытался сделать из кнопки гиперссылку — не вышло

SomeDeveloper, А дебажить не пробовал? Почему вылетает, что за исключение?
Попробуй MainFrame.Content = new MainPage();
Или даже
public MainWindow() < InitializeComponent(); this.Loaded += (sender, args) =>< MainFrame.Content = new MainPage(); >; >
Решения вопроса 1

Программист (.NET)
Ответ написан более двух лет назад
Просят без открытия и закрытия, а Вы советуете
new Page1()

soloveid, открытия и закрытия форм/окон, а не страниц. Всё правильно. Ну или никто не мешает ему не создавать новые страницы, а использовать существующие. По вашему я должен под каждый вопрос заново переписывать код со всеми тонкостями? Думаю, нет. В примере по ссылке сама идея как реализовать навигацию по страницам, а что делать со страницами каждый решит для себя сам. Решить создать новый экземпляр страницы или использовать ранее созданный — это элементарная задача
Ответы на вопрос 1
if (window.WindowState == WindowState.Minimized) window.WindowState = WindowState.Normal; window.Activate();
Вот так попробуйте, если ваши формы это Window-ы
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C#
- +1 ещё
Как проверять столкновение префаба и UI панели в Unity?
- 1 подписчик
- 4 часа назад
- 20 просмотров
Взаимодействие окон

Класс Application предоставляет два инструмента для получения доступа к другим окнам: свойство MainWindow и свойство Window. При желании отслеживать окна более специализированным образом — например, путем отслеживания экземпляров определенного класса Window, которые могут представлять документы — разработчик может добавлять в класс Application собственные статические свойства.
Разумеется, получение ссылки на другое окно — это только полдела. Также необходимо определиться со способом взаимодействия. В принципе необходимость во взаимодействии окон следует сводить к минимуму, поскольку это излишне усложняет код. Однако если действительно требуется, чтобы значение элемента управления в одном окне изменялось на основе действия, выполняемого пользователем в другом окне, тогда, конечно, лучше создать в целевом окне специальный метод. Это гарантирует правильную идентификацию зависимости и добавит еще один уровень косвенности, упрощающий подгонку изменений в интерфейсе окна.
Если два окна должны взаимодействовать между собой каким-то сложным образом, разрабатываются или развертываются отдельно либо подвержены изменениям, можно двинуться на шаг дальше и формализовать их взаимодействие, создав интерфейс с общедоступными методами и реализовав его в классе своего окна.
Ниже на рисунках представлены два примера реализации такой схемы. На первом рисунке показано окно, которое вынуждает второе окно обновлять свои данные в ответ на щелчок на кнопке. Это окно не пытается напрямую изменить пользовательский интерфейс второго окна; вместо этого оно полагается на специальный промежуточный метод по имени DoUpdate().
Второй пример иллюстрирует ситуацию, когда требуется обновление более одного окна. В этом случае действующее окно полагается на более высокоуровневый метод приложения, который вызывает методы, требуемые для обновления других окон (возможно, даже путем прохода по коллекции окон). Этот подход лучше, т.к. он работает на более высоком уровне. В подходе, показанном на первом рисунке, действующему окну не нужно знать ничего конкретного об элементах управления в получающем окне. В подходе, приведенном на втором рисунке, производится еще один шаг вперед: здесь действующему окну ничего не нужно знать даже о классе получающего окна:


При взаимодействии между окнами очень часто полезным оказывается метод Window.Activate(). Этот метод позволяет передавать команду активизации нужному окну. Можно также использовать свойство Window.IsActive для проверки того, является ли данное окно в текущий момент единственным активным окном.
В этом примере привязку можно ослабить. Вместо того, чтобы вызывать метод в разных окнах, класс Application может просто возбуждать событие и позволить окнам самостоятельно выбирать, как на него реагировать.
Поддержка команд WPF может помочь абстрагировать логику приложения. Команды представляют собой специфические для приложений задачи и могут инициироваться любым способом.
Примеры, приведенные на рисунках, показывают, как отдельные окна (обычно немодальные) могут инициировать друг в друге различные действия. Однако существуют и более простые модели взаимодействия окон (такие как модели диалоговых окон), а также модели, которые дополняют данную (вроде моделей владения окнами).
Владение окнами
В .NET окно может «владеть» другими окнами. Окна, имеющие окно-владельца, удобно применять для плавающих окон панелей инструментов и окон команд. Одним из примеров такого окна является окно Find and Replace (Найти и заменить) в Microsoft Word. Когда окно-владелец сворачивается, окно, которым оно владеет, тоже автоматически сворачивается. Когда имеющее владельца окно перекрывает окно, которое им владеет, оно всегда отображается сверху.
Для поддержки владения окна класс Window предлагает два свойства: Owner и OwnedWindows. Свойство Owner представляет собой ссылку, которая указывает на окно, владеющее текущим окном (если таковое имеется), а свойство OwnedWindows — коллекцию всех окон, которыми владеет текущее окно (опять-таки, если они есть). Настройка владения окна подразумевает просто установку свойства Owner, как показано ниже:
//Создание нового окна. ToolWindow winTool = new ToolWindow(); // Назначение текущего окна владельцем. winTool.Owner = this; // Отображение окна, принадлежащего окну-владельцу. winTool.Show ();
Окна, обладающие окном-владельцем, всегда отображаются как немодальные. Чтобы удалить такое окно, нужно всего лишь установить для его свойства Owner значение null.
WPF не включает системы для построения многодокументных приложений (Multiple Document Interface — MDI). Если необходимо более сложное управление окнами, придется разработать его самостоятельно (или приобрести нужный компонент у независимых разработчиков).
Окно, имеющее владельца, может само владеть каким-нибудь другим окном, которое, в свою очередь, может владеть еще каким-нибудь окном и т.д. (хотя практическая пригодность такого проектного решения весьма сомнительна). Единственным ограничением является то, что окно не может владеть самим собой, а также то, что два окна не могут владеть друг другом.