WPF - Prism 7.1 - Навигация - Управление вкладками мастеринга - Модальное / диалоговое окно - PullRequest
0 голосов
/ 17 ноября 2018

Я использую навигационную среду 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>

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Может быть, он просто не находит вашего взгляда.Разве второй параметр не должен быть 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 не получает ссылку на ваш регион.

0 голосов
/ 19 ноября 2018

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

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

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

с менеджером региона из ServiceLocator:

ServiceLocator.Current.GetInstance<IRegionManager>()
0 голосов
/ 19 ноября 2018

Шаблон 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, с вами все будет в порядке.

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

...