如何在磁贴运行时使用 UWP 应用执行磁贴中保存的命令

本文关键字:执行 保存 命令 应用 运行时 UWP | 更新日期: 2023-09-27 18:31:24

我有一个应用程序,它将辅助磁贴固定在开始屏幕上,并在磁贴中存储了某个命令。

  1. 如果应用程序正在运行或在后台运行,并且我点击固定磁贴,则应用无法从磁贴获取参数,因为未调用主页的 OnNavigatedTo 方法。
  2. 如果我关闭/终止应用程序,则会调用 OnNavigatedTo 方法,因此我可以从磁贴中获取参数。

在第 1 点,不会调用 OnNavigatedTo,因为在 App.xaml 中.cs仅当它未设置为根框架的内容时,才会导航到主页:

if (rootFrame.Content == null)
{
     // When the navigation stack isn't restored navigate to the first page,
     // configuring the new page by passing required information as a navigation
    // parameter
    rootFrame.Navigate(typeof(Views.MainPage), e.Arguments);
}

因此,当 rootFrame.Content 不为空时,不会调用 MainPage.OnNavigatedTo。

我尝试通过删除上面的 if 语句来解决问题,但每次点击磁贴时都会实例化主页。因此,如果我从应用列表启动应用,然后点击磁贴,则两次。

我希望磁贴在应用程序未运行时启动应用程序,并在应用程序运行时执行其存储的命令,而无需再次实例化 MainPage。

是否有避免这种情况的最佳实践方法?我应该只处理 App.xaml.cs 中的磁贴命令吗?

//...
else
{
    if (e.PreviousExecutionState == ApplicationExecutionState.Running || e.PreviousExecutionState == ApplicationExecutionState.Suspended)
    {
         var mainPage = rootFrame.Content as Views.MainPage;
         if (mainPage != null)
         {
             string command = e.Arguments;
             if (!String.IsNullOrWhiteSpace(command) && command.Equals(Utils.DefaultTileCommand))
             {
                  await mainPage.HandleCommand(command);
             }
         }
     }
}

谢谢

如何在磁贴运行时使用 UWP 应用执行磁贴中保存的命令

磁贴参数将传递给 App.xaml.cs OnLaunch 方法。

如果你想让你的主页接收参数,你必须添加一些特殊的逻辑。可以通过检查 TileId(除非已手动编辑应用清单,否则将为"应用")来确定你是从辅助磁贴启动的。然后,您可以确定当前是否显示 MainPage,如果是,请调用您在 MainPage 上添加的方法,以将参数传递给当前实例。

这是代码...

protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
    ...
    if (rootFrame.Content == null)
    {
        // When the navigation stack isn't restored navigate to the first page,
        // configuring the new page by passing required information as a navigation
        // parameter
        rootFrame.Navigate(typeof(Views.MainPage), e.Arguments);
    }
    // If launched from secondary tile and MainPage already loaded
    else if (!e.TileId.Equals("App") && rootFrame.Content is MainPage)
    {
        // Add a method like this on your MainPage class
        (rootFrame.Content as MainPage).InitializeFromSecondaryTile(e.Arguments);
    }
    ...

如果在App类中重写此Application方法:

protected override async void OnActivated(IActivatedEventArgs args)

。你应该被调用 - 至少这种方法适用于 Toast 通知。 Application有一大堆可覆盖的入口点。

(您说的是哪种OnNavigatedTo方法?页面有这样的方法;该应用程序没有?