Windows 8 Metro:如何点击GridViewItem?

use*_*265 1 gridview microsoft-metro windows-8

我正在使用GridView构建一个Windows 8 Metro应用程序(C#,XAML),我想在用户点击的GridViewItem附近显示一个弹出窗口.我计划通过click事件参数获取GridViewItem UIElement,并使用其坐标来确定弹出窗口的位置.

但是,我还没有找到一种方法来获取对被点击的实际GridViewItem UIElement的引用!我在下面尝试过的事件似乎只通过它们的EventArgs暴露了DataContext,而不是实际的UIElement:

object sender // is the GridView
ItemClickEventArgs.ClickedItem // is the DataContext of the GridViewItem
ItemClickEventArgs.OriginalSource // is the GridView
SelectionChangedEventArgs.OriginalSource // is null
SelectionChangedEventArgs.AddedItems.First() // is the DataContext of the GridViewItem
Run Code Online (Sandbox Code Playgroud)

如果重要,我的GridView.ItemSource是一个CollectionViewSource,其Source绑定到一个viewmodels集合.

是否有可能通过我忽略的一些事件获得点击的GridViewItem?如果没有,我应该用什么角度来解决它呢?我至少可以通过PointerPressed事件得到相对于GridView的点击坐标,看看我能做些什么来找到那个项目,但我真的希望我不必走那条路.

SWa*_*ica 6

我还在应用程序中实现了这种行为 - 使用Callisto库中的Flyout弹出窗口以及单击的GridViewItem.

简单地调用ContainerFromItem来获取相关的GridViewItem控件要容易得多:

private void itemGridView_ItemClick(object sender, ItemClickEventArgs e)
{
    var clickedItem = itemGridView.ItemContainerGenerator.ContainerFromItem(e.ClickedItem);

    // Open the flyout now
    Flyout flyOut = new Flyout();
    if (clickedItem is GridViewItem)
        flyOut.PlacementTarget = clickedItem as UIElement;
    else
        flyOut.PlacementTarget = sender as UIElement;

    flyOut.Placement = PlacementMode.Left;
    SolidColorBrush br = new SolidColorBrush(Colors.Blue);
    flyOut.Background = br;
    TextBlock tb = new TextBlock();
    tb.Text = "I'm in your flyout messing with your text";

    flyOut.Content = tb;
    flyOut.IsOpen = true;
}
Run Code Online (Sandbox Code Playgroud)

感谢这个帖子让我指向正确的方向.