#c# #wpf #xaml
#c# #wpf #xaml
Вопрос:
Это приложение WPF / C #, и у меня больше проблем с дизайном, чем с кодом.
У меня есть 5 отдельных файлов * .xaml, реализующих класс, производный от window . Итак, 5 окон. Это приложение типа мастера, поэтому в каждом окне есть кнопки назад / далее, которые создают новое окно, скрывают себя и показывают новое окно.
Это не основано исключительно на навигации (поэтому я не использую страницы), потому что иногда я хочу пропустить окно или вернуться к первому окну и т.д.
Каждый раз, когда открывается новое окно, родительское окно устанавливает себя в качестве владельца нового окна и скрывается. При использовании кнопки «Назад» новое окно показывает владельца и закрывается само. Это отлично работает для навигации.
У меня проблема, когда кто-то фактически закрывает окно, а не использует навигацию. Если они закроют окно, нажмите Alt-F4, нажмите X и т. Д., Это должно закрыть все приложение.
Моя кнопка «вернуться назад» также закрывает окно, которое запускает Window_Closed, закрывая все приложение.
Я пытаюсь придумать способ закрыть все приложение, когда пользователь закрывает окно, но закрыть только окно (не скрыть его, фактически избавиться от него) и показать владельцу, когда они нажмут назад. Кажется, я не могу сделать последнее, не запуская первое.
Есть предложения? Я просто не думаю об этом правильно.
Ответ №1:
Вместо переключения между окнами я бы рекомендовал переключаться между пользовательскими элементами управления в панелях. У вас есть полная функциональность окна, за исключением того, что вам не нужно беспокоиться о его открытом / закрытом состоянии. Просто попросите UserControls переключать видимость на основе следующих / предыдущих команд.
Вы могли бы рассмотреть возможность создания навигации для вашего мастера. Вы можете сделать это в WPF, как показано здесь .
С навигацией у вас есть одно окно, в котором размещаются страницы. Затем вы можете ввести команду для перехода на определенную страницу, и она автоматически перейдет на страницу, не беспокоясь о видимости элемента управления.
Комментарии:
1. Я изучил использование навигации и фактически посмотрел это конкретное видео. На самом деле это не то, чего я хочу. Это больше похоже на навигацию по веб-страницам и позволяет переходить между страницами. У меня есть очень конкретные правила того, что «назад» и «далее» должны делать в каждом случае — они могут пропускать страницы или запускать код в зависимости от контекста. Я также использую usercontrols в каждом из моих 5 окон, по сути, это 1 или более пользовательских элементов управления, так что, возможно, стоит изучить. Мне пришлось бы переместить логику для back / next из элемента управления в окно, но это может стоить того
2. @user783106 — Да, вы захотите вставить back / next в главное окно и из ваших размещенных элементов управления. Когда они нажимают кнопку Назад / Далее, вы можете использовать любые правила, которые вы хотите, чтобы выбрать следующий пользовательский элемент управления. Просто переключите видимость самостоятельно, если вы не хотите использовать навигацию.
3. Но просто примечание, вы можете использовать правила для навигации. Существует метод, называемый NavigateTo ( «строковое имя страницы» ). Когда они нажимают кнопку, в коде за вами будет выполняться любая логика, необходимая для определения следующей страницы. Когда вы будете готовы отобразить его, просто вызовите NavigateTo(), передав имя следующей страницы (которая может быть полностью динамической, если это необходимо).
4. Спасибо, это полезный совет, но в качестве моего первого приложения WPF (и первого приложения на C #) у меня сейчас достаточно проблем, поэтому, хотя идея нескольких окон не очень хороша, проще всего начать и запустить со временем, которое я сравнил со страницами навигации. Хотя мне нравится идея одного окна с несколькими пользовательскими элементами управления, я думаю, что именно так я и собираюсь поступить. Это небольшая редизайн и немного сложнее, но устраняет достаточно проблем, чтобы сделать его полезным
5. После этого я решил использовать одно окно WPF и очистить / загрузить пользовательские элементы управления, а также показать / скрыть / включить / отключить любую из моих собственных кнопок навигации по мере необходимости. Это оказалось намного лучше, чем иметь несколько окон. Спасибо, что предложили это.
Ответ №2:
Прежде всего, я бы сделал не 5 разных окон, а одно окно и заменил бы его содержимое при изменении страницы мастера. Это выглядело бы более естественно для пользователя, и проблема вообще не проявится.
Во-вторых, если вы настаиваете на дизайне с несколькими окнами, я бы просто отписался от закрытия в обработчике нажатия кнопки (и повторно подпишитесь, когда я снова открою окно).
Комментарии:
1. С точки зрения пользователя, они не знают, что существует 5 разных окон. Позиции и размеры одинаковы. Однако я понимаю вашу точку зрения. Есть ли у вас пример отказа от подписки конкретно от обработчика щелчка на кнопке закрытия? Есть и другие способы закрыть окно, например, alt-f4 . Есть ли предложение разъединить закрытое событие окна с любым обработчиком в случае, когда я закрываю его с помощью кнопки «Назад»? Я думаю, это имело бы смысл