2

GridViewGotFocusLostFocusは、フォーカスがGridViewItemから別のものに移動するたびに発生するようです。 GridViewが全体として受信してフォーカスを失ったときを知る方法はありますか?GridView LostFocusイベントとGotFocusイベント

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

上記のイベントMyGridView_GotFocus & MyGridView_LostFocusは知っているどのような方法がありますたびにフォーカスがMyGridView

+0

私はあなたの質問を理解していません。 Tabキーを使用してコントロール間を移動すると、最初にLostFocusイベントが発生し、もう1つではGotFocusイベントが発生します。 1つのイベントだけが欲しいですか?あなたの目標は何ですか? –

+0

@IgorDamiani:質問を更新しました。 – Bells

答えて

2

に別のGridViewItemから移動した発射時に全受信して失われたフォーカスなどGridView

これを行う方法はありません。そのような振る舞いを模倣するための回避策しか使用できません。基本的な考えは、GotFocusLostFocusは両方ともRouted Eventsであるため、ページルートグリッドのGotFocusLostFocusイベントで、GridViewのGotFocusLostFocusを模倣することができます。コード

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

そしてここにある:あなたは、ルートグリッドがフォーカスを得たすべての時間を見ることができるように

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

ここ

はXAMLです。 PreviousFocusItemTargetGridViewではない位置し、 CurrentFocusItemTargetGridViewにある場合。つまり、 TargetGridViewが全体としてフォーカスを取得したことを意味します。 LostFocusのロジックは似ています。

私の完全なプロジェクトは、GridViewFocusSampleです。

関連する問題