2017-06-21 86 views
2

我有一个AutoSuggestBox可见性设置为Collapsed。在同一个视图页面中,我有一个按钮。点击按钮后,我想显示AutoSuggestBox。当查询已提交或AutoSuggestBox已失去焦点时,我想再次隐藏它。UWP专注于AutoSuggestBox

这里的AutoSuggestBox和按钮:

<AutoSuggestBox Name="MainAutoSuggestBox" 
       Grid.Row="2" 
       GotFocus="MainAutoSuggestBox_GotFocus" 
       Visibility="Collapsed" 
       QueryIcon="Find"        
       QuerySubmitted="MainAutoSuggestBox_QuerySubmitted" 
       LostFocus="MainAutoSuggestBox_LostFocus"/> 

<Button Name="TopBarSearchButton" 
     Content="Button" 
     Click="TopBarSearchButton_Click"/> 

我的后台代码:

class SomePage : page 
{ 
    ... 
    ... 

    private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     //only for testing purposes 
    } 

    private void MainAutoSuggestBox_LostFocus(object sender, RoutedEventArgs e) 
    { 
     MainAutoSuggestBox.Visibility = Visibility.Collapsed; 

     //put focus on the page 
     this.Focus(FocusState.Programmatic); 
    } 

    private void MainAutoSuggestBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args) 
    { 
     //Do something 
     //Works fine 
    } 

    private void TopBarSearchButton_Click(object sender, RoutedEventArgs e) 
    { 
     HandleSearchButtonClick(); 
    } 

    private void HandleSearchButtonClick() 
    { 
     if (MainAutoSuggestBox.Visibility == Visibility.Collapsed) 
     { 
      MainAutoSuggestBox.Visibility = Visibility.Visible; 
      MainAutoSuggestBox.Focus(FocusState.Programmatic); 
     } 
     else 
     {  
      MainAutoSuggestBox.Visibility = Visibility.Collapsed; 
     }  
    } 
} 

现在的问题是,当我按一下按钮TopBarSearchButton 首次的MainAutoSuggestBox知名度切换,但重点不在MainAutoSuggestBox上设置。但从第二次开始,它按预期工作,即在点击该按钮时,MainAutoSuggestBox切换的可见性以及焦点在MainAutoSuggestBox上设置。

在调试过程中,我发现,当单击第一次按钮时, 控制流量达到行MainAutoSuggestBox.Focus(FocusState.Programmatic);HandleSearchButtonClick()但它从来没有碰到

private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e) 

方法,但是从第二次开始,它确实打到了

private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e) 

方法。

+0

标题是'UWP'。 – lindexi

回答

2

我们先来研究为什么焦点不是第一次设定。

首先,订阅Loaded事件MainAutoSuggestBox的,在处理程序中,你会发现,MainAutoSuggestBoxRenderSize<0,0>。这很有意义,因为您已将控件的Visibility设置为XAML中的Collapsed,导致控件忽略所有尺寸更改事件。

因此,通过时间的下面第二行代码打的第一次,虽然Visibility设置为Visible,控制尚未完全呈现,所以下面Focus()不会生效。在那之后,控制就完成了渲染,这就是为什么从第二次Focus()现在可以正常工作。

MainAutoSuggestBox.Visibility = Visibility.Visible; 
    MainAutoSuggestBox.Focus(FocusState.Programmatic); 

有几个方法可以解决这个问题。首先是订阅SizeChanged事件,然后在处理程序中,只有,当旧的大小为<0,0>并且新大小是别的,您知道它已完成呈现,请在那里调用Focus()

或者更容易,不要将其设置为XAML Collapsed,但这样做在Loaded事件处理程序,因为它会崩溃之前完全呈现 -

MainAutoSuggestBox.Loaded += (s, e) => MainAutoSuggestBox.Visibility = Visibility.Collapsed;