1

我有一个基本的 RSS 阅读器,它在左侧 Grid.Column 的 listView 中显示博客文章列表。右侧的 Grid.Column 是 WebView。当用户在 listView 中选择一个项目时,Webview 会更新为 Uri 并显示网页。

现在,我添加了一个 BottomAppBar 并创建了 Pin/UnPin 按钮。我已经成功创建了固定功能,但是,我没有将任何数据传递到 NavigationContext 的查询字符串中。因此,当用户单击固定磁贴时,它只会深度链接到整个页面,而不是所选文章。这会加载所有最新文章,而不是所选项目的 url。

我知道我必须将 Url 传递到固定磁贴的查询字符串中,但我被困在这里。我已经在我的 Windows Phone 应用程序中这样做了几十次,但我被困在了这个 Windows 8 应用程序中。在 WP7 上,我使用上下文菜单来固定项目。在这里,我从 appbar 固定,我似乎无法获取 url 并将其添加为查询字符串(作为我的 TileActivationArgument)

主要是我需要指导如何获取所选项目的数据并将其放到磁贴上以及如何读取它回来。这是我的 Pin() 方法:

编辑:我已经做了一个临时的工作解决方案,但它并没有解决我无法检索所选项目属性的问题。注释与代码内联

private async void PinTileHelper(string message, object sender)
    {
        //This is my preferred method, but I cannot extract the SelectedItem's properties
        //var item = itemListView.SelectedItem;


        //I'm not able to use the sender because this is a button click
        //var selectedItem = (FeedItems)((ListView)sender).SelectedItem;

        //As a cheesy workaround, I just took the Uri directly from the WebView's source Uri
        var ActivationArgument = this.ContentView.Source.ToString();

        Uri logo = new Uri("ms-appx:///Assets/squareTile-sdk.png");
        //Uri smallLogo = new Uri("ms-appx:///Assets/smallTile-sdk.png");

        SecondaryTile secondaryTile = new SecondaryTile("Toolbox",
                                                        "Fantasy Football Tile",
                                                        "Article name goes here and ",
                                                        ActivationArgument,
                                                        TileOptions.ShowNameOnLogo,
                                                        logo);

        secondaryTile.ForegroundText = ForegroundText.Dark;
        //secondaryTile.SmallLogo = smallLogo;

        bool isPinned = await secondaryTile.RequestCreateAsync();

        MessageDialog dialog = new MessageDialog("Pinned?");

        if (isPinned)
        {
            dialog.Content = "You have succesfully pinned this tile";
            await dialog.ShowAsync();
        }
        else
        {
            dialog.Content = "Something went wrong. The tile wasn't pinned.";
            await dialog.ShowAsync();
        }
    }

感谢您提供的任何见解。

编辑#2:成功!!安全地投射到您的 ItemViewModel 项目就可以了。

var item = itemListView.SelectedItem as FeedItems (or your ItemViewModel items);
4

1 回答 1

1

尝试更换

var selectedItem = (FeedItems)((ListView)sender).SelectedItem;

var selectedItem = (FeedItems)((ListView)sender).SelectedItem as FeedItem;

我假设这是 as 语句的正确类类型。这将允许您访问所选项目的所有属性,包括 Uri。如果在此调用后 selectedItem 为 null,则您没有转换为正确的类型。转换为适当的类类型。现在,使用原样的代码,您将得到一个普通的旧对象。

是的,您抓取 LaunchArgs 并将它们传递到您的目标页面,作为处理您的开始导航的一部分。

于 2012-09-04T22:25:20.610 回答