Хобрук: Ваш путь к мастерству в программировании

NavigationWindow - Где это?

Мое приложение WPF становится настоящей болью. Я создал окно и хотел бы загрузить другую страницу, когда я нажимаю кнопку. Я предполагал, что это будет просто, но, похоже, это не так. Мне удается загрузить другую страницу, используя this.content = new UserPage(). Однако с этой страницы пользователя я не могу вернуться в свое главное окно. Я не могу использовать this.content, потому что окно не может быть дочерним.

Поэтому я поискал и обнаружил, что должен использовать NavigationService, чтобы упростить задачу. Я пытался использовать NavigationService.GetNavigationService(this), но это не сработало, так как всегда возвращалось значение null. Я решил, что это потому, что мое главное окно происходит от Window, а не NavigationWindow. Есть ли способ преобразовать мое окно в NavigationWindow без повторного запуска проекта? Всякий раз, когда я создаю новый файл, шаблона NavigationWindow нет — только окно, страница, пользовательский элемент управления и т. д.

Я попытался вручную заменить XAML на NavigationWindow, и он работал нормально, но метод NavigationService по-прежнему возвращал значение null. Вверху также была полоса со стрелками назад и вперед (оба отключены), но мне это действительно не нужно. Я просто хотел бы использовать метод Navigate(), чтобы легко переключаться между страницами. Любые идеи о том, что я могу сделать?

Спасибо за любую помощь, это сводит меня с ума! :)


Ответы:


1

Я попытался вручную заменить XAML на NavigationWindow, и он работал нормально, но метод NavigationService по-прежнему возвращал значение null.

Вам не нужен NavigationService, если ваше окно уже является NavigationWindow. NavigationWindow имеет метод Navigate.

Вы также можете использовать стандартный Window и поместить на него элемент управления Frame. Он работает примерно как NavigationWindow, за исключением того, что он встроен в окно.

15.08.2010
  • Спасибо за ответ. Как вставить рамку в окно? У меня есть сетка (которая содержит весь макет), но когда я помещаю рамку в окно, она заменяет сетку. Есть ли способ вставить рамку в существующее окно? Еще раз спасибо 15.08.2010
  • Поместите рамку внутрь сетки 15.08.2010
  • Это работает. Я пытался поместить свой макет в саму рамку. Вместо этого я просто поместил фрейм в верхнюю часть визуального дерева и вызвал его метод Navigate(), который, похоже, работает. Спасибо за помощь. 15.08.2010
  • Привет @ThomasLevesque, есть ли способ использовать NavigateService в MVVM? 03.07.2014
  • @ArijitMukherjee, да, но вы должны абстрагировать его за интерфейсом, чтобы ViewModel не манипулировала объектом пользовательского интерфейса напрямую (и для улучшения тестируемости). 03.07.2014
  • @ArijitMukherjee, не в комментариях, нет... задайте вопрос, кто-нибудь на него ответит (вероятно, не я, у меня сейчас нет времени) 03.07.2014

  • 2

    Скодер,

    Я не совсем уверен, что вы пытаетесь сделать, но я посмотрю, смогу ли я помочь. Во-первых, похоже, что вам нужен NavigationWindow. Если вам нужна только одна страница в вашем приложении, то ваш первый подход будет работать, но в ту минуту, когда вы говорите о более чем одной странице и хотите перейти с одной страницы на другую, вы говорите о NavigationWindow.

    Во-вторых, как только вы выберете окно навигации, XAML должен быть простым, просто замените Window на NavigationWindow, и все будет готово, за исключением того, что теперь вам нужно понять, что вы больше не будете напрямую управлять содержимым окна. Вместо этого с этим справится встроенный NavigationService. О, и вам не нужно создавать явный NavigationService, так как класс уже предоставляет его. Вам просто нужно ориентироваться:

     this.Navigate(new Url("pack://aplication:,,,/MyAssembly,component/MyPage.xaml", UriKind.Absolute));
    

    в качестве альтернативы можно использовать XAML:

    Source = "pack://aplication:,,,/MyAssembly,component/MyPage.xaml"
    

    На этом этапе вам понадобится некоторый интерфейс, позволяющий вашим пользователям переходить с одной страницы на другую (например, элемент управления Breadcrumb или TreeView), но как только они появятся, встроенный элемент управления перемещением позволит вам перемещаться по журналу, который поддерживается автоматически для вас. То есть большая часть основной работы по навигации сделана за вас, вам просто нужно понять, как пользователь переходит вперед к какому-то контенту.

    Но в этот момент все может стать довольно странным. Я столкнулся с этим сам. Поскольку вы не можете добавить во фрейм сетку или любое другое явное содержимое, вам нужно изменить шаблон NavigationWindow, чтобы добавить дополнительные элементы управления, составляющие обычное приложение. Такие вещи, как меню и панели инструментов, не являются частью стандартного WPF NavigationWindow.

    Простите эту бесстыдную саморекламу, но я создал продукт, потому что столкнулся с этими ограничениями, а на рынке не было ничего доступного. Посмотреть демо можно по адресу:

    http://www.teraque.com/products/explorer-chrome-suite/

    Он был разработан как профессиональная версия WPF NavigationControl, которую Microsoft раздает бесплатно. Взгляните на демонстрацию, если вы не хотите покупать пакет, я буду рад дать вам подсказки, если вы хотите использовать это направление для своего приложения.

    Искренне,

    Дональд Рой Эйри

    [email protected]

    14.02.2011

    3

    Я сделал это, но не смог понять, как перезагрузить родительское окно из оператора vb.net на странице, расположенной в фрейме. У меня есть код в функции window_loaded, которую я хочу выполнить.

    16.08.2010
  • Вы используете navigationservice.goback? 16.08.2010
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..