gpt4 book ai didi

c# - UWP 专注于 AutoSuggestBox

转载 作者:行者123 更新时间:2023-11-30 15:57:41 26 4
gpt4 key购买 nike

我有一个可见性设置为 CollapsedAutoSuggestBox。在同一 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;
}
}
}

现在的问题是,当我点击按钮 TopBarSearchButtonMainAutoSuggestBox 的可见性第一次切换,但焦点未设置在 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 事件,在处理程序内部,您会发现 RenderSizeMainAutoSuggestBox<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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com