Windows 8 Metro:如何点击GridViewItem?

时间:2012-08-02 16:27:03

标签: gridview windows-8 microsoft-metro

我正在使用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

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

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

2 个答案:

答案 0 :(得分: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;
}

感谢this thread here让我指向了正确的方向。

答案 1 :(得分:0)

VisualTreeHelper可能会帮助您将其放置到GridView / GridViewItem并找到它的子/父,如果您想要找到UIElement。要确定容器内部的UIElement是什么,应使用 VisualTreeHelper 来解决。

有关VisualTreeHelper的更多信息,请访问Visual Tree Helper example

如果你不想使用VisualTreeHelper,我会创建一个attach属性,我的所有GridViewItem单击都将自己作为dependencyObject传递给GridView的附加属性(这是自定义的,你可以得到更多的是它。)