WPF - Prism 7.1 - Навигация - Управление вкладкой Mastering - Модальное / диалоговое окно

Я использую платформу навигации Prism 7.1 (WPF), чтобы открыть диалоговое окно, используя конфигурацию ниже. Это успешно. Однако я хочу, чтобы в этом всплывающем окне были вкладки, между которыми можно перемещаться. Когда я нажимаю кнопку во всплывающем окне, пытаясь отобразить внутри него ViewA, ничего не происходит. Установив точку останова, я вижу, что путь навигации достигнут, и отображается правильное имя представления. Обратитесь к PopUpWindow.cs. Однако, когда идет разрешение представления, оно не отображается. Хуже того, ошибки не возникает! Я не понимаю, почему это происходит.

Предполагая, что мои пространства имен верны, что я делаю не так?

PrismApplication.cs

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<ViewA>();
}

//Have tried register type, register type for navigation, etc etc.

MainWindowViewModel.xaml

<Window 
        xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i = "http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:prism = "http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel = "True"
        Height = "350" Width = "525">
    <i:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject = "{Binding NotificationRequest}">
            <prism:PopupWindowAction IsModal = "True" CenterOverAssociatedObject = "True" />
        </prism:InteractionRequestTrigger>
    </i:Interaction.Triggers>
    <StackPanel>
        <Button Margin = "5" Content = "Raise Default Notification" Command = "{Binding NotificationCommand}" />
    </StackPanel>

MainWindowViewModel.cs

public MainWindowViewModel
{
    public InteractionRequest<INotification> NotificationRequest { get; set; }
    public DelegateCommand NotificationCommand { get; set; }

    public MainWindowViewModel()
    {
        NotificationRequest = new InteractionRequest<INotification>();
        NotificationCommand = new DelegateCommand(RaiseNotification);
    }

    void RaiseNotification()
    {
        NotificationRequest.Raise(new PopupWindow());
    }
}

PopUpWindow.xaml

<UserControl 
        xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism = "http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel = "True"
        Height = "350" Width = "525">
    <DockPanel LastChildFill = "True">
        <StackPanel Orientation = "Horizontal" DockPanel.Dock = "Top" Margin = "5" >
            <Button Command = "{Binding NavigateCommand}" CommandParameter = "ViewA" Margin = "5">Navigate to View A</Button> 
        </StackPanel>
        <ContentControl prism:RegionManager.RegionName = "ContentRegion" Margin = "5"  />
    </DockPanel>
</UserControl>

PopUpWindow.cs

public class PopupWindowViewModel
{
    private readonly IRegionManager _regionManager;

    public DelegateCommand<string> NavigateCommand { get; private set; }

    public PopupWindowViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;

        NavigateCommand = new DelegateCommand<string>(Navigate);
    }

    private void Navigate(string navigatePath)
    {
        if (navigatePath != null)
            _regionManager.RequestNavigate("ContentRegion", navigatePath); 

        //During debugging, this correctly shows navigatePath as "ViewA"
    }
}

ViewA.xaml

<UserControl 
             xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism = "http://prismlibrary.com/"             
             prism:ViewModelLocator.AutoWireViewModel = "True">
    <Grid>
        <TextBlock Text = "ViewA" FontSize = "48" HorizontalAlignment = "Center" VerticalAlignment = "Center" />
    </Grid>
</UserControl>

Вы используете формы xamarin? RegisterForNavigation - это метод регистрации для навигации в формах Xamarin, а не wpf в соответствии с документами.

Dipen Shah 19.11.2018 06:43

Согласно примерам Brians Prism 7.1, он также действителен для WPF (его пример находится в модуле, а не в основном загрузчике) github.com/PrismLibrary/Prism-Samples-Wpf/blob/master/…

user1870035 19.11.2018 07:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
1 662
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Паттерн InteractionRequest немного необычный. Вам необходимо убедиться, что все представления, которые должны реагировать на запрос, имеют необходимый InteractionRequestTrigger в визуальном дереве. Таким образом, немедленное решение вашей проблемы - скопировать ваш XAML с MainWindowView.xaml на ViewA.xaml:

<UserControl 
        xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism = "http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel = "True"
        Height = "350" Width = "525">
   <i:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject = "{Binding NotificationRequest}">
            <prism:PopupWindowAction IsModal = "True" CenterOverAssociatedObject = "True" />
        </prism:InteractionRequestTrigger>
    </i:Interaction.Triggers> 
    <!-- ... -->
</UserControl>

Затем обязательно добавьте NotificationRequest в модель просмотра для ViewA. Обратите внимание, что вы все еще можете столкнуться со сценариями, когда запрос на взаимодействие не работает. Например. при добавлении триггеров внутри в шаблон данных. Хотя, если вы поместите их на уровень UserControl, все будет в порядке.

Одним из возможных улучшений этого (ошибочного) дизайна является создание поведения, в котором вы программно добавляете эти триггеры взаимодействия.

Может быть, дело просто не в том, что ты видишь. Разве второй параметр не должен быть URL-адресом, а не строкой? Отсюда: https://prismlibrary.github.io/docs/wpf/Navigation.html

    IRegionManager regionManager = ...;
regionManager.RequestNavigate("MainRegion",
                                new Uri("InboxView", UriKind.Relative));

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

var testinstance = System.Windows.Application.LoadComponent(testUrl);

https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.loadcomponent?view=netframework-4.7.2

И если вы используете MEF, я думаю, вам также нужно отметить View атрибутом Export.

Надеюсь, ваша проблема в том, что вы просто забыли про папку или что-то подобное.

В противном случае это может быть связано с тем, что regionmanager не получает ссылку на ваш регион.

Ответ принят как подходящий

Регионы, которых нет в визуальном дереве, игнорируются диспетчером регионов. Вы определяете ContentRegion в PopUpWindow (который создается лениво), поэтому его нет, и запрос навигации для неизвестной области просто игнорируется.

Как подробно описано здесь и там, в этом случае вам необходимо вручную добавить регион в конструктор представления, содержащего его:

RegionManager.SetRegionName( theNameOfTheContentControlInsideThePopup, WellKnownRegionNames.DataFeedRegion );
RegionManager.SetRegionManager( theNameOfTheContentControlInsideThePopup, theRegionManagerInstanceFromUnity );

с региональным менеджером от ServiceLocator:

ServiceLocator.Current.GetInstance<IRegionManager>()

Другие вопросы по теме