C# GridView LostFocus和GotFocus事件

C# GridView LostFocus和GotFocus事件,c#,gridview,windows-store-apps,win-universal-app,winrt-xaml,C#,Gridview,Windows Store Apps,Win Universal App,Winrt Xaml,每次焦点从一个GridView项目转移到另一个GridView项目时,GotFocus和LostFocus似乎都会触发。有没有办法知道一个GridView作为一个整体何时收到并失去焦点 MyGridView.GotFocus += MyGridView_GotFocus; MyGridView.LostFocus += MyGridView_LostFocus; 每当焦点在MyGridView中从一个gridview项目移动到另一个 有没有办法知道一个GridView作为一个整体何时收到并失去

每次焦点从一个
GridView项目转移到另一个
GridView项目时,
GotFocus
LostFocus
似乎都会触发。有没有办法知道一个
GridView
作为一个整体何时收到并失去焦点

MyGridView.GotFocus += MyGridView_GotFocus;
MyGridView.LostFocus += MyGridView_LostFocus;
每当焦点在
MyGridView
中从一个
gridview项目移动到另一个

有没有办法知道一个
GridView
作为一个整体何时收到并失去焦点

MyGridView.GotFocus += MyGridView_GotFocus;
MyGridView.LostFocus += MyGridView_LostFocus;
没有直接的方法可以做到这一点。我们只能使用变通方法来模仿这种行为。基本思想是,由于
GotFocus
LostFocus
都是,我们可以在页面根网格的
GotFocus
LostFocus
事件中模拟GridView的
GotFocus
LostFocus
事件

以下是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>

这是输出文本:
焦点按钮
以下是代码:

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;
        }
    }
}
公共密封部分类主页面:第页
{
公开名单;
公开名单2;
私有对象优先聚焦项;
公共主页()
{
this.InitializeComponent();
}
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
列表=新列表{“data1_GridView1”、“data2_GridView1”、“data3_GridView1”};
List2=新列表{“data1_GridView2”、“data2_GridView2”、“data3_GridView2”};
myGridView.ItemsSource=列表;
myGridView2.ItemsSource=List2;
rootGrid.GotFocus+=Grid\u GotFocus;
rootGrid.LostFocus+=Grid\u LostFocus;
基地。导航到(e);
}
私有void Grid\u LostFocus(对象发送方,路由目标)
{
PreviousFocusItem=e.原始来源;
}
专用void Grid_GotFocus(对象发送器、路由目标)
{
//获取上一个焦点元素和当前焦点元素。
var previous=作为UIElement的PreviousFocusItem;
var current=e.作为UIElement的原始电源;
//聚焦逻辑
如果(!IsElementInsideGridView(myGridView,上一个))&&IsElementInsideGridView(myGridView,当前))
{
//gridView作为一个整体获得了关注,请将代码放在此处:
output.Text+=“获得焦点+1\n”;
}
//失焦逻辑
如果(!IsElementInsideGridView(myGridView,当前))&&(IsElementInsideGridView(myGridView,上一个)))
{
//gridView整体失去焦点,请将代码放在此处:
output.Text+=“失去焦点+1\n”;
}
}
私有布尔IsElementInsideGridView(GridView GridView,UIElement)
{
Point topLeft=gridView.TransformToVisual(this.TransformPoint(new Point());
Rect rectBounds=new Rect(topLeft.X,topLeft.Y,gridView.ActualWidth,gridView.ActualHeight);
IEnumerable hits=VisualTreeHelper.FindElementsInHostCoordinates(rectBounds,element);
如果(hits==null | | hits.Count()==0)
{
返回false;
}
其他的
{
返回true;
}
}
}
正如您每次看到根网格获得焦点时所看到的。如果以前的焦点项目不在目标网格视图中,而当前焦点项目目标网格视图中。这意味着,TargetGridView作为一个整体获得了关注。对于LostFocus,逻辑类似


这是我的完整项目:。

我不明白你的问题。使用该选项卡从一个控件移动到另一个控件时,第一个控件触发LostFocus事件,第二个控件触发GotFocus事件。你只想参加一个活动吗?你的目标是什么?@IgorDamiani:我已经更新了这个问题。