c# - UWP 专注于 AutoSuggestBox

标签 c# xaml uwp

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

现在的问题是,当我点击按钮 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 事件,在处理程序内部,您会发现 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/

相关文章:

c# - NuGet 包 - 未引用 lib 文件夹中的 DLL?

c# - UWP 拉伸(stretch) GridView

Windows 通用 (UWP) 图表库

c# - 具有静态列名称的 GridView 表

c# - 如何获取或计算 Azure 文件/共享或服务的大小

c# - 使用语法编写测试数据生成器

xaml - 用于在将鼠标悬停在不同控件上时切换控件可见性的 Windows 8 XAML 解决方案

c# - MVVM ItemsControl 简单绑定(bind)

uwp - 如何访问 UWP 应用中的注册表项?

c# - 如何关闭已在目录中打开的文件