Я использую платформу навигации 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>
Согласно примерам Brians Prism 7.1, он также действителен для WPF (его пример находится в модуле, а не в основном загрузчике) github.com/PrismLibrary/Prism-Samples-Wpf/blob/master/…





Паттерн 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);
И если вы используете MEF, я думаю, вам также нужно отметить View атрибутом Export.
Надеюсь, ваша проблема в том, что вы просто забыли про папку или что-то подобное.
В противном случае это может быть связано с тем, что regionmanager не получает ссылку на ваш регион.
Регионы, которых нет в визуальном дереве, игнорируются диспетчером регионов. Вы определяете ContentRegion в PopUpWindow (который создается лениво), поэтому его нет, и запрос навигации для неизвестной области просто игнорируется.
Как подробно описано здесь и там, в этом случае вам необходимо вручную добавить регион в конструктор представления, содержащего его:
RegionManager.SetRegionName( theNameOfTheContentControlInsideThePopup, WellKnownRegionNames.DataFeedRegion );
RegionManager.SetRegionManager( theNameOfTheContentControlInsideThePopup, theRegionManagerInstanceFromUnity );
с региональным менеджером от ServiceLocator:
ServiceLocator.Current.GetInstance<IRegionManager>()
Вы используете формы xamarin? RegisterForNavigation - это метод регистрации для навигации в формах Xamarin, а не wpf в соответствии с документами.