首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GridView LostFocus和GotFocus事件

GridView LostFocus和GotFocus事件
EN

Stack Overflow用户
提问于 2016-07-20 05:14:55
回答 1查看 2.2K关注 0票数 2

每次焦点从一个GotFocus转移到另一个GridViewItem时,LostFocusGridViewItem似乎都会触发。有没有任何方法可以知道GridView作为一个整体何时接收到并失去焦点?

代码语言:javascript
复制
MyGridView.GotFocus += MyGridView_GotFocus;
MyGridView.LostFocus += MyGridView_LostFocus;

上述事件MyGridView_GotFocus & MyGridView_LostFocus每次焦点在MyGridView中从一个GridViewItem移动到另一个GridViewItem时触发

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 10:29:24

有没有任何方法可以知道GridView作为一个整体何时接收到并失去焦点?

没有直接的方法可以做到这一点。我们只能用一种方法来模仿这种行为。基本思想是,由于GotFocusLostFocus都是路由事件,所以我们可以在页面根网格的GotFocusLostFocus事件中模拟GridView的GotFocusLostFocus

以下是XAML:

代码语言:javascript
复制
<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>

这是密码:

代码语言:javascript
复制
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;
        }
    }
}

正如您所看到的,每次根网格获得焦点。如果PreviousFocusItem不在TargetGridView,中,CurrentFocusItemTargetGridView.中这意味着TargetGridView作为一个整体得到了关注。对于LostFocus,逻辑类似。

这是我的完整项目:GridViewFocusSample

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38472816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档