2

Die GridViewGotFocus und LostFocus scheinen jedes Mal ausgelöst zu werden, wenn der Fokus von einem GridViewItem auf einen anderen verschoben wird. Gibt es eine Möglichkeit zu wissen, wann ein GridView als Ganzes den Fokus erhalten und verloren hat?GridView LostFocus und GotFocus Ereignisse

MyGridView.GotFocus += MyGridView_GotFocus; 
MyGridView.LostFocus += MyGridView_LostFocus; 

Die oben genannten Ereignisse MyGridView_GotFocus & MyGridView_LostFocus feuert jedes Mal Fokus von einem GridViewItem zum anderen in MyGridView

+0

Ich verstehe Ihre Frage nicht. Wenn Sie das Register verwenden, um von einem Steuerelement zu einem Steuerelement zu wechseln, löst das erste ein LostFocus-Ereignis aus und das zweite löst ein GotFocus-Ereignis aus. Willst du nur eine Veranstaltung? Was ist dein Ziel? –

+0

@IgorDamiani: Ich habe die Frage aktualisiert. – Bells

Antwort

2

Gibt es bewegt wird, eine Möglichkeit, zu wissen, wann ein GridView als Ganzes aufgenommen und hat den Fokus verloren?

Es gibt keinen direkten Weg, dies zu tun. Wir können nur eine Problemumgehung verwenden, um dieses Verhalten zu imitieren. Der Grundgedanke ist, dass seit der GotFocus und LostFocus beide Routed Events sind, können wir die Gridview von GotFocus und LostFocus in Seite Wurzel Grid GotFocus und LostFocus Ereignisse imitieren. Hier

ist die XAML:

<Grid Name="rootGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel Margin="100,50"> 
     <StackPanel VerticalAlignment="Center" > 
      <GridView Name="myGridView"></GridView> 
    </StackPanel> 
     <TextBlock Name="myTb"></TextBlock> 
     <GridView Name="myGridView2" ></GridView> 
    <TextBlock Name="output">This is the OutPut Text: </TextBlock> 
     <Button Name="btnFocus" >Focus Button</Button> 
    </StackPanel> 
</Grid> 

Und hier ist die Codes:

public sealed partial class MainPage : Page 
{ 
    public List<String> List; 
    public List<String> List2; 
    private object PreviousFocusItem; 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     List = new List<string> { "data1_GridView1", "data2_GridView1", "data3_GridView1" }; 
     List2 = new List<string> { "data1_GridView2", "data2_GridView2", "data3_GridView2" }; 
     myGridView.ItemsSource = List; 
     myGridView2.ItemsSource = List2; 
     rootGrid.GotFocus += Grid_GotFocus; 
     rootGrid.LostFocus += Grid_LostFocus; 
     base.OnNavigatedTo(e); 
    } 

    private void Grid_LostFocus(object sender, RoutedEventArgs e) 
    { 
     PreviousFocusItem = e.OriginalSource; 
    } 

    private void Grid_GotFocus(object sender, RoutedEventArgs e) 
    { 
     //get the previous focus Element and current focus Element. 
     var previous = PreviousFocusItem as UIElement; 
     var current = e.OriginalSource as UIElement; 

     //got focus logic 
     if ((!IsElementInsideGridView(myGridView, previous)) &&IsElementInsideGridView(myGridView,current)) 
     { 
      //gridView got focus as a whole, put your codes here: 
      output.Text += "Got Focus+1 \n"; 
     } 

     //lost focus logic 
     if ((!IsElementInsideGridView(myGridView, current)) &&(IsElementInsideGridView(myGridView,previous))) 
     { 
      //gridView lost focus as a whole, put your codes here: 
      output.Text += "Lost Focus+1 \n"; 
     } 
    } 

    private bool IsElementInsideGridView(GridView gridView,UIElement element) 
    { 
     Point topLeft = gridView.TransformToVisual(this).TransformPoint(new Point()); 
     Rect rectBounds = new Rect(topLeft.X, topLeft.Y, gridView.ActualWidth, gridView.ActualHeight); 
     IEnumerable<UIElement> hits = VisualTreeHelper.FindElementsInHostCoordinates(rectBounds, element); 
     if (hits == null || hits.Count() == 0) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 
} 

Wie Sie jedes Mal die Wurzel Grid Fokus bekam sehen. Wenn das PreviousFocusItem liegt nicht in dem TargetGridView und CurrentFocusItem liegt in dem TargetGridView. Es bedeutet TargetGridView bekam den Fokus als Ganzes. Für LostFocus ist die Logik ähnlich.

Hier ist mein komplettes Projekt: GridViewFocusSample.