GridView LostFocus和GotFocus事件 [英] GridView LostFocus and GotFocus events

查看:374
本文介绍了GridView LostFocus和GotFocus事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

GridView GotFocus LostFocus 每次焦点从一个 GridViewItem 转移到另一个。有什么方法可以知道一个 GridView 作为一个整体收到并丢失了什么?

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

上述事件MyGridView_GotFocus&每次将焦点从一个 GridViewItem 移动到另一个 MyGridView

GridView 作为一个整体接收和丢失的时间吗?解决方案重点?

没有直接的方法可以做到这一点。我们只能使用一种解决方法来模仿该行为。基本思想是,既然 GotFocus LostFocus 都是路由事件,我们可以模拟GridView的 GotFocus 和 LostFocus 在页面根网格的 GotFocus LostFocus Events。



以下是XAML:

 < Grid Name =rootGridBackground ={ThemeResource ApplicationPageBackgroundThemeBrush}> 
< StackPanel Margin =100,50>
< StackPanel VerticalAlignment =中心>
< GridView Name =myGridView>< / GridView>
< / StackPanel>
< TextBlock Name =myTb>< / TextBlock>
< GridView Name =myGridView2>< / GridView>
< TextBlock Name =output>这是OutPut Text:< / TextBlock>
<按钮名称=btnFocus>聚焦按钮< /按钮>
< / StackPanel>
< / Grid>

以下是代码:

  public sealed partial class MainPage:Page 
{
public List< String>清单;
public List< String>列表2;
private object PreviousFocusItem;
public MainPage()
{
this.InitializeComponent();


保护覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
List = new List< string> {data1_GridView1,data2_GridView1,data3_GridView1};
List2 =新列表< 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)
{
//获取前一个焦点元素和当前焦点元素。
var previous = PreviousFocusItem as UIElement;
var current = e.OriginalSource as UIElement;

//获得焦点逻辑
if((!!IsElementInsideGridView(myGridView,previous))&& IsElementInsideGridView(myGridView,current))
{
// gridView把焦点作为一个整体,把你的代码放在这里:
output.Text + =Got Focus + 1 \\\
; ($!


//失去焦点逻辑
if((!!IsElementInsideGridView(myGridView,current))&&(& {
// gridView作为一个整体失去了焦点,把你的代码放在这里:
output.Text + =Lost Focus + 1 \\\
;



private bool IsElementInsideGridView(GridView gridView,UIElement元素)
{
Point topLeft = gridView.TransformToVisual(this).TransformPoint(new点());
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;



$ / code $ / pre

每一次你都可以看到根网格得到了重点。如果 PreviousFocusItem 不在 TargetGridView 中,并且 CurrentFocusItem 位于 TargetGridView 中。这意味着 TargetGridView 作为一个整体得到了关注。对于LostFocus,逻辑是类似的。



这是我的完整项目: GridViewFocusSample


The GridView GotFocus and LostFocus seem to fire each time focus is shifted from one GridViewItem to another. Is there any way to know when a GridView as a whole received and lost focus?

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

The above events MyGridView_GotFocus & MyGridView_LostFocus fires each time focus is moved from one GridViewItem to another in MyGridView

解决方案

Is there any way to know when a GridView as a whole received and lost focus?

There is no direct way to do that. We can only use a workaround to imitate that behavior. The basic thought is that since the GotFocus and LostFocus are both Routed Events, we can imitate the GridView's GotFocus and LostFocus in page root Grid's GotFocus and LostFocus Events.

Here is the 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>

And here is the 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;
        }
    }
}

As you can see every time the root Grid got focus. If the PreviousFocusItem lies not in the TargetGridView, and CurrentFocusItem lies in the TargetGridView. It means TargetGridView got focus as a whole. For LostFocus the logic is similar.

Here is my complete project:GridViewFocusSample.

这篇关于GridView LostFocus和GotFocus事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆