首页 > 解决方案 > 使用 Timeline 跳转到应用详情页

问题描述

在我的应用程序中,我有一个顶部菜单、一个“列表页面”和“详细信息页面”。列表页面上的信息作为参数传递给详细信息页面。

我正在尝试使用时间轴跳回我的应用程序的详细信息页面,方法是在详细信息页面中创建一个 ActivationUri,然后在 OnActivated 中的 App.xaml.cs 中创建关联代码。但是,当我单击时间轴中的项目时,应用程序只会导航到默认主页。我认为问题在于当我使用时间轴时应用程序没有“记住”传递的参数。

对此的任何建议,如果可能的话,将不胜感激。谢谢。

应用程序.xaml.cs:

DetailPage detailpage = new DetailPage();
var mylink = detailpage.pageid;

if (uriArgs.Uri.Host == mylink)
{
    NavigationService.Navigate(typeof(DetailPage), uriArgs);
}

DetailPage.xaml.cs:

public string pageid;

    public DetailPage()
    {
        this.InitializeComponent();
    }

    protected override async void OnNavigatedTo    (NavigationEventArgs e)
    {
        var MyClickedItem = (MyModel)e.Parameter;
        Title.Text = MyClickedItem.Title;
        pageid = MyClickedItem.Id;

        // Get channel and create activity.
        UserActivityChannel channel =     UserActivityChannel.GetDefault();
        UserActivity activity = await     channel.GetOrCreateUserActivityAsync("details" + MyClickedItem.Id);

        // Set deep-link and properties.
        activity.ActivationUri = new Uri("my-app://" +     MyClickedItem.Id);
        activity.VisualElements.DisplayText = Title.Text;
    }   

标签: c#uwp

解决方案


首先,我澄清DetailPagePage您的示例中的 与DetailPage您上面的代码中的相对应。

stuff变量(mylink在上面的代码中)为 null的原因是您创建了一个新的DetailPagePage类对象,该DetailPagePage对象与单击 GridView 项时导航到的对象不同。当你创建一个新DetailPagePage对象时,这个新DetailPagePage对象pageid没有赋值,所以它是空的。

您可以将pageid属性更改为DetailPagePage类的静态属性,然后您可以pageid在 App.xaml.cs 中访问相同的属性,

DetailPagePage你只需要更改pageid为静态,

public static string pageid;

然后,在您OnActivated的 App.xaml.cs 方法中,由于将 设为uriArgs.Uri.Host小写Title,当您与 pageid 进行比较时,您需要调用该ToLower()方法。所以该OnActivated方法看起来像这样:

protected override async void OnActivated(IActivatedEventArgs args)
{
    await ActivationService.ActivateAsync(args);

    if (args.Kind == ActivationKind.Protocol)
    {
        var uriArgs = args as ProtocolActivatedEventArgs;

        if (uriArgs != null)
        {
            //DetailPagePage detailpage = new DetailPagePage();
            var stuff = DetailPagePage.pageid;

            if (uriArgs.Uri.Host == stuff.ToLower())
            {
                NavigationService.Navigate(typeof(DetailPagePage), uriArgs);
            }
        }
        Window.Current.Activate();
    }
}

之后,您还需要修改您的导航参数uriArgsDetailPagePage'sOnNavigatedTo方法,因为uriArgs无法转换为 a MyModel,您可能需要使用导航参数数据来创建MyModel具有相同信息的对象以显示它们。

---更新---

您可能需要使用导航参数数据来创建MyModel具有相同信息的对象以显示它们。

也就是说,你可以在方法中创建一个与你点击MyModel的对象具有相同属性值的新对象,然后在方法中传递这个对象,那么方法会是这样的:MyModelOnActivatedNavigateOnActivated

protected override async void OnActivated(IActivatedEventArgs args)
{
    await ActivationService.ActivateAsync(args);

    if (args.Kind == ActivationKind.Protocol)
    {
        var uriArgs = args as ProtocolActivatedEventArgs;

        if (uriArgs != null)
        {
            //DetailPagePage detailpage = new DetailPagePage();
            var stuff = DetailPagePage.pageid;
            MyModel parameter = null;
            if (uriArgs.Uri.Host == stuff.ToLower())
            {
                switch (stuff)
                {
                    case "Title1":
                        parameter = new MyModel
                        {
                            Title = "Title1",
                            Subtitle = "My Subtitle 1",
                            Description = "My Description 1 goes here."
                        };
                        break;
                    case "Title2":
                        parameter = new MyModel
                        {
                            Title = "Title2",
                            Subtitle = "My Subtitle 2",
                            Description = "My Description 2 goes here."
                        };
                        break;
                    //Some other case      
                }
                NavigationService.Navigate(typeof(DetailPagePage), parameter);
            }
        }
        Window.Current.Activate();
    }
}

推荐阅读