我有一个可见性设置为 Collapsed
的 AutoSuggestBox
。在同一 View 页面中,我有一个按钮。单击按钮时,我想显示 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>
.这是有道理的,因为您已经设置了 Visibility
控件到 Collapsed
在 XAML 中,导致控件忽略所有大小更改事件。
因此,当下面代码的第二行第一次命中时,尽管 Visibility
设置为 Visible
,控件尚未完全呈现,因此以下 Focus()
将无效。之后,控件完成渲染,这就是为什么从第二次开始 Focus()
现在将正常工作。
MainAutoSuggestBox.Visibility = Visibility.Visible;
MainAutoSuggestBox.Focus(FocusState.Programmatic);
有几种方法可以解决这个问题。首先是订阅SizeChanged
事件,然后在处理程序中,仅旧大小为 <0,0>
时新尺寸是另外一回事,您知道它已完成渲染,请调用 Focus()
那里。
或者更简单地说,不要将其设置为 Collapsed
在 XAML 中,但在 Loaded
中执行事件处理程序,因为它将在折叠之前完全呈现 -
MainAutoSuggestBox.Loaded += (s, e) => MainAutoSuggestBox.Visibility = Visibility.Collapsed;
关于c# - UWP 专注于 AutoSuggestBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44671800/