【问题标题】:Windows 8 Metro: How to get clicked GridViewItem?Windows 8 Metro:如何获得点击的 GridViewItem?
【发布时间】:2012-08-02 16:27:02
【问题描述】:

我正在使用 GridView 构建一个 Windows 8 Metro 应用程序(C#、XAML),我想在用户单击的 GridViewItem 附近显示一个弹出窗口。我计划通过单击事件参数获取 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 绑定到一个视图模型集合。

是否可以通过我忽略的某些事件来获取单击的 GridViewItem?如果不是,我应该从什么角度来解决它?我至少可以通过 PointerPressed 事件获取相对于 GridView 的点击坐标,然后看看我能做些什么来以这种方式定位项目,但我真的希望我不必走那条路。

【问题讨论】:

    标签: gridview windows-8 microsoft-metro


    【解决方案1】:

    我还在一个应用程序中实现了这种行为 - 使用 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 为我指明了正确的方向。

    【讨论】:

      【解决方案2】:

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

      更多关于 VisualTreeHelper 的信息可以在这里找到Visual Tree Helper example

      如果您不想使用 VisualTreeHelper,我将创建一个附加属性,我所有的 GridViewItem 单击都将作为依赖对象传递给 GridView 的附加属性(这是自定义的,您可以从中获得更多)。

      【讨论】:

      • 谢谢,破解了。 VisualTreeHelper.FindElementsInHostCoordinates() 是要走的路,它返回给定点的 UIElements 集合(来自 PointerPressed 事件),然后您可以过滤到 GridViewItem。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多