Shell.Current.GoToAsync 到 xct:Popup 导致错误 System.NullReferenceException

Shell.Current.GoToAsync to xct:Popup results in error System.NullReferenceException

我想用 Xamarin 社区工具包弹出窗口显示一个弹出窗口,但我尝试使用 Shell 导航到它我收到错误消息“System.NullReferenceException Message=Object reference not set to an一个对象的实例。"

我的弹出窗口 xaml:

<?xml version="1.0" encoding="utf-8" ?>
<xct:Popup 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
    x:Class="Restuco_Tables.Views.AddAreaPopup"
    Shell.PresentationMode="ModalAnimated"
    Size="300, 300">
    <StackLayout>
        <Label Text="This is a Popup!" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"/>
    </StackLayout>
</xct:Popup>  

代码隐藏:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class AddAreaPopup : Popup
{
    public AddAreaPopup()
    {
        InitializeComponent();
    }
}

我在App中注册了RoutingShell:

Routing.RegisterRoute(nameof(AddAreaPopup), typeof(AddAreaPopup));

我使用 Shell 调用弹出窗口:

private async void tbiNewArea_Clicked(object sender, EventArgs e)
{
    await Shell.Current.GoToAsync("/AddAreaPopup");
}

Shell Navigation可以看出Shell.Current.GoToAsync需要ShellNavigationState类型的数据,显然弹出页面不是,所以才会出现这个错误。

如果您使用一个简单的 ContentPage,没有问题。

所以我建议你可以使用Rg.Plugins.Popup Popup Pages,然后使用await PopupNavigation.Instance.PushAsync(new Page2());从Shell.

中的一个ContentPage转到PopupPage
private async void btn1_Clicked(object sender, EventArgs e)
{
    await PopupNavigation.Instance.PushAsync(new Page2());
    //await Shell.Current.GoToAsync("page2");
       
}

最后,使用await PopupNavigation.Instance.PopAsync(true);关闭这个弹出页面。

private async void btnclose_Clicked(object sender, EventArgs e)
{
    await PopupNavigation.Instance.PopAsync(true);
}

有xaml这样的:

<popup:PopupPage
    x:Class="shellsample.Views.Page2"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:popup="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup">

    <StackLayout>
        <Frame
            BackgroundColor="Red"
            BorderColor="Black"
            CornerRadius="30">
            <StackLayout>
                <Label
                    HorizontalOptions="CenterAndExpand"
                    Text="Welcome to Xamarin.Forms!"
                    VerticalOptions="CenterAndExpand" />
                <Button
                    x:Name="btnclose"
                    Clicked="btnclose_Clicked"
                    Text="close" />
            </StackLayout>
        </Frame>
    </StackLayout>
</popup:PopupPage>

您还需要在 MainActivity.cs OnCreate 方法中初始化 Rg.Plugins.Popup.Popup。

Rg.Plugins.Popup.Popup.Init(this);

您还可以在 Add support to Shell Navigation

的 shell 导航中提交一项功能