1

GridViewを使用してWindows8Metroアプリケーション(C#、XAML)を構築していますが、ユーザーがクリックしたGridViewItemの近くにポップアップを表示したいと思います。クリックイベント引数を介してGridViewItemUIElementを取得し、その座標を使用してポップアップを配置する場所を決定することを計画していました。

ただし、クリックされた実際のGridViewItemUIElementへの参照を取得する方法はまだ見つかりません。以下で試したイベントは、実際のUIElementではなく、EventArgsを介してDataContextのみを公開しているようです。

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に関連するクリック座標を取得し、その方法でアイテムを見つけるために何ができるかを確認できますが、実際にはそのルートをたどる必要がないことを望んでいます。

4

2 に答える 2

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;
}

私を正しい方向に向けてくれたこのスレッドに感謝します。

于 2012-09-01T16:36:20.710 に答える
0

VisualTreeHelperは、それをGridView / GridViewItemのいずれかに配置し、UIElementを検索する場合の子/親を検索するのに役立つ場合があります。コンテナ内でクリックされたUIElementを特定するには、VisualTreeHelperを使用して解決する必要があります。

VisualTreeHelperの詳細については、VisualTreeHelperの例を参照してください。

VisualTreeHelperを使用したくない場合は、GridViewItemのすべてのクリックが依存関係オブジェクトとしてGridViewのattachプロパティに渡されるattachプロパティを作成します(これはカスタムであり、より多くを得ることができます)。

于 2012-08-02T17:44:18.493 に答える