我的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)
方法
答案 0 :(得分:2)
让我们首先弄清楚为什么焦点没有第一次设定。
首先,订阅处理程序中Loaded
的{{1}}事件,您会发现MainAutoSuggestBox
的{{1}}为RenderSize
。这是有道理的,因为您已在XAML中将控件的MainAutoSuggestBox
设置为<0,0>
,从而导致控件忽略所有大小更改事件。
因此,当下面第二行代码第一次命中时,虽然Visibility
设置为Collapsed
,但控件尚未完全呈现,因此以下{{ 1}}将不起作用。之后,控件完成渲染,这就是为什么Visibility
上的第二次现在可以正常工作。
Visible
有几种方法可以解决这个问题。首先是订阅Focus()
事件,然后在处理程序中,仅当旧版本为Focus()
且新尺寸为其他内容时,您知道它已完成渲染,调用 MainAutoSuggestBox.Visibility = Visibility.Visible;
MainAutoSuggestBox.Focus(FocusState.Programmatic);
那里。
或者更容易,不要在XAML中将其设置为SizeChanged
,而是在<0,0>
事件处理程序中执行,因为它会在折叠之前完全呈现 -
Focus()