我正在使用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的点击坐标,看看我能做些什么来找到那个项目,但我真的希望我不必走那条路。
答案 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的附加属性(这是自定义的,你可以得到更多的是它。)