Uwp Windows模板工作室Caliburn.Micro添加新页面

Uwp Windows模板工作室Caliburn.Micro添加新页面,uwp,caliburn.micro,navigationview,Uwp,Caliburn.micro,Navigationview,我正在尝试用Windows Template Studio、Caliburn.Micro和Navigation View开发一个UWP解决方案。问题是,当我添加一个新页面时,在尝试导航时会出现“System.NullReferenceException:'对象引用未设置为对象的实例'”错误 我注意到在方法中: private void OnItemInvoked(WinUI.NavigationViewItemInvokedEventArgs args) { if (ar

我正在尝试用Windows Template Studio、Caliburn.Micro和Navigation View开发一个UWP解决方案。问题是,当我添加一个新页面时,在尝试导航时会出现“System.NullReferenceException:'对象引用未设置为对象的实例'”错误

我注意到在方法中:

private void OnItemInvoked(WinUI.NavigationViewItemInvokedEventArgs args)
    {
        if (args.IsSettingsInvoked)
        {
            // Navigate to the settings page - implement as appropriate if needed
        }
        else if (args.InvokedItemContainer is WinUI.NavigationViewItem selectedItem)
        {
            var pageType = selectedItem.GetValue(NavHelper.NavigateToProperty) as Type;
            var viewModelType = ViewModelLocator.LocateTypeForViewType(pageType, false);
            _navigationService.NavigateToViewModel(viewModelType);
        }
    }
ViewModelLocator.LocateTypeForViewType(pageType,false)返回“NULL”

我在各自的文件夹中添加了新的视图和视图模型,并将它们称为TestPage和TestViewModel。我还在App.xaml.cs文件中添加了“_container.PerRequest()”,并在Resources.resw文件中添加了Shell_测试项

这就是ShellView.xaml的外观:

<winui:NavigationView
    x:Name="navigationView"
    IsBackButtonVisible="Visible"
    IsBackEnabled="{x:Bind ViewModel.IsBackEnabled, Mode=OneWay}"
    SelectedItem="{x:Bind ViewModel.Selected, Mode=OneWay}"
    IsSettingsVisible="False"
    cm:Message.Attach="[Event ItemInvoked] = [Action OnItemInvoked($eventArgs)]"
    Background="{ThemeResource SystemControlBackgroundAltHighBrush}">
    <winui:NavigationView.MenuItems>
       
        <winui:NavigationViewItem x:Uid="Shell_ContenedorMapa" Icon="Document" helpers:NavHelper.NavigateTo="views:ContenedorMapaPage" />
        <winui:NavigationViewItem x:Uid="Shell_Page1" Icon="Document" helpers:NavHelper.NavigateTo="views:RNDPage" />
        <winui:NavigationViewItem x:Uid="Shell_Page2" Icon="Document" helpers:NavHelper.NavigateTo="views:IPHPage" />
        <winui:NavigationViewItem x:Uid="Shell_Page3" Icon="Document" helpers:NavHelper.NavigateTo="views:SIPPage" />
        <winui:NavigationViewItem x:Uid="Shell_Test" Icon="Document" helpers:NavHelper.NavigateTo="views:PruebaPage" />
    </winui:NavigationView.MenuItems>
    <i:Interaction.Behaviors>
        <behaviors:NavigationViewHeaderBehavior
            x:Name="navigationViewHeaderBehavior"
            DefaultHeader="{x:Bind ViewModel.Selected.Content, Mode=OneWay}">
            <behaviors:NavigationViewHeaderBehavior.DefaultHeaderTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock
                            Text="{Binding}"
                            Style="{ThemeResource TitleTextBlockStyle}"
                            Margin="{StaticResource SmallLeftRightMargin}" />
                    </Grid>
                </DataTemplate>
            </behaviors:NavigationViewHeaderBehavior.DefaultHeaderTemplate>
        </behaviors:NavigationViewHeaderBehavior>
    </i:Interaction.Behaviors>
    <Grid>
        <Frame x:Name="shellFrame" DataContext="{x:Null}" />
    </Grid>
</winui:NavigationView>

谁能告诉我我错过了什么?我已经搜索了一段时间了,没有幸找到一个教程或任何类型的信息

提前谢谢

干杯

默认情况下,Caliburn Micro遵循视图和视图模型的命名规则(以View/ViewModel pr Page/PageViewModel结尾)。“LocateTypeForViewType”方法将遵循命名约定的规则查找/检测指定视图的视图模型

在您的例子中,命名约定是不同的(TestPage/TestViewModel)。你有两个选择

  • 更改视图/视图模型的命名,以遵循Caliburn Micro使用的约定
将视图/视图模型重命名为TestPage/TestPageViewModel

  • 使用NameTransformer识别您自己的命名约定
命名约定基于规则。Caliburn Micro允许您添加自己的规则

比如说

ViewLocator.NameTransformer.AddRule("Model$", string.Empty);
您可以在此处阅读有关名称转换器的更多信息。

您的问题解决了吗?你有什么进展吗?@AryaDing MSFT没有。。。这个问题没有解决。一旦我找到解决方案,我会把它贴在这里。干杯谢谢你的回答!遗憾的是,它没有起作用。在UWP中(至少在使用Windows Template Studio生成项目时),命名约定已设置为Page/ViewModel。还有什么我可以试试的吗?谢谢!!