XAML 无法从OnAppearing中打开Maui中的弹出窗口

yk9xbfzb  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(166)

问题:

从MAUI内容页面的OnAppearing方法中调用Maui Community Toolkit方法:ShowPopup导致异常:System.InvalidOperationException: 'Could not locate MauiContext.'
当不在OnAppearing方法中使用时,它似乎工作得很好。
最终目标是在页面加载数据时显示弹出窗口(带有微调器),然后在加载数据后将其删除。
Maui社区工具包版本:5.0.0安卓/毛伊岛版本:net7.0-安卓Dotnet版本:7.0
内容页:

public partial class FilesInMediaStorePage : ContentPage
{
    public FilesInMediaStorePage()
    {
        InitializeComponent();
        BindingContext = new FilesInMediaStoreViewModel();
    }
    protected override void OnAppearing()
    {
        this.ShowPopup(new SpinnerPopup()); //causes the exception: System.InvalidOperationException: 'Could not locate MauiContext.'
        Task.Run(async () =>
        {
            this.ShowPopup(new SpinnerPopup()); //has no affect
            await this.ShowPopupAsync(new SpinnerPopup()); //has no affect
        });
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        this.ShowPopup(new SpinnerPopup()); //works just fine
    }
}

弹出窗口:

<toolkit:Popup
    x:Class="FullSail.Views.SpinnerPopup"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
    CanBeDismissedByTappingOutsideOfPopup="True"
    
    >
    <VerticalStackLayout>
        <ActivityIndicator IsRunning="True" />
        <Label TextColor="Red" Text="Loading..." />
        <Label TextColor="Red" Text="This is a very important message!" />
        <Button Text="OK" 
                Clicked="OnOKButtonClicked" />
    </VerticalStackLayout>
</toolkit:Popup>

我尝试同时使用方法的voidasync方法-还在Task中调用了该方法,但没有成功。
我还寻找了一个不同的合适的基方法来覆盖,而不是OnAppearing,但是似乎没有其他方法在页面加载上启动。

l2osamch

l2osamch1#

不,那不起作用。您已经要求毛伊岛同时准备显示页面,并在您显示弹出窗口时阻止页面。

  • 相反,将spinner作为页面上的一个元素。让页面显示最少的内容,同时在Task.Run中准备所需的数据。
  • 任何影响UI的更改都必须推迟,直到您使用Dispatcher返回MainThread。
// --- Inside "OnAppearing" ---
// make spinner (element on page) visible.
...
Task.Run(() =>
{
    // Prepare data here, as local variables that are not used by UI.
    // Do not touch any UI element, or any code property bound to a UI element!
    ...

    // When data is ready:
    Dispatcher.Dispatch(() =>
    {
        // Make changes to UI elements and bound properties here.
        // (From the local variables you prepared above.)
        ...
        // hide spinner
        ...
    }
}
```cs

相关问题