2012-08-02 3 views
1

GridView를 사용하여 Windows 8 Metro 응용 프로그램 (C#, XAML)을 구축 중이며 사용자가 클릭 한 GridViewItem 근처에 팝업을 표시하고 싶습니다. 클릭 이벤트 인수를 통해 GridViewItem UIElement를 가져오고 좌표를 사용하여 내 팝업을 배치 할 위치를 결정할 계획이었습니다.Windows 8 Metro : 클릭 한 GridViewItem을 얻는 방법?

그러나 실제로 클릭 한 실제 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이며, 뷰 모델의

내가 간과 한 일부 이벤트를 통해 클릭 한 GridViewItem을 가져올 수 있습니까? 그렇지 않다면, 그 문제를 해결하기 위해 어떤 각도로 조사해야합니까? PointerPressed 이벤트를 통해 GridView와 관련된 클릭 좌표를 가져올 수는 있습니다. 그런 식으로 항목을 찾으려면 어떻게해야하는지 알지만 실제로 그 경로를 따라갈 필요가 없기를 바랍니다.

답변

0

VisualTreeHelper는 GridView/GridViewItem에 배치하고 UIElement를 찾으려면 자식/부모를 찾는 데 도움이 될 수 있습니다. 어떤 UIElement가 컨테이너 내부를 클릭했는지 확인하려면 VisualTreeHelper을 사용하여 해결해야합니다.

VisualTreeHelper에 더

어떤 (당신이 VisualTreeHelper를 사용하지 않을 경우, 내 모든 GridViewItem 클릭이 (가)의 GridView의 연결 속성에 DependencyObject에 스스로를 통과 할 것이다 첨부 속성을 만들 것입니다 여기 Visual Tree Helper example

발견 관례이고 당신은 그것에서 더 많은 것을 얻을 수있다).

+0

감사합니다. VisualTreeHelper.FindElementsInHostCoordinates()는 PointerPressed 이벤트의 지정된 지점에서 UIElements 컬렉션을 반환하는 GridViewItem까지 필터링 할 수있는 방법입니다. – user1454265

6

클릭 속성 GridViewItem과 함께 Callisto 라이브러리의 플라이 아웃 팝업을 사용하여 앱에서이 동작을 구현했습니다.

단순히 관련 GridViewItem 제어를 얻을 수 ContainerFromItem를 호출 훨씬 쉽습니다 : 올바른 방향으로 날을 가리키는위한 this thread here

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

감사합니다.

관련 문제