我有一个AutoSuggestBox
,可见性设置为Collapsed
。在同一视图页面中,我有一个按钮。单击按钮后,我要显示AutoSuggestBox
。当查询已提交或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)
方法。
最佳答案
首先让我们弄清楚为什么不是第一次设置焦点。
首先,订阅Loaded
的MainAutoSuggestBox
事件,在处理程序中,您会发现RenderSize
的MainAutoSuggestBox
是<0,0>
。这是有道理的,因为您已在XAML中将控件的Visibility
设置为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;