【问题标题】:UWP Focus on AutoSuggestBoxUWP 专注于 AutoSuggestBox
【发布时间】:2017-11-24 02:29:48
【问题描述】:

我有一个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 上。

在调试的时候发现第一次点击按钮的时候, 控制流在HandleSearchButtonClick() 内到达MainAutoSuggestBox.Focus(FocusState.Programmatic); 行,但它从未到达

private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e)

方法,但是从第二次开始,它确实命中了

private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e)

方法。

【问题讨论】:

  • 标题是UWP

标签: c# xaml uwp


【解决方案1】:

让我们先弄清楚为什么第一次没有设置焦点。

首先,订阅MainAutoSuggestBoxLoaded事件,在handler里面,你会发现MainAutoSuggestBoxRenderSize&lt;0,0&gt;。这是有道理的,因为您已在 XAML 中将控件的 Visibility 设置为 Collapsed,从而导致控件忽略所有大小更改事件。

所以,当下面代码的第二行第一次命中时,虽然Visibility 设置为Visible,但控件还没有完全呈现,所以下面的Focus() 将不会影响。之后,控件完成渲染,这就是为什么从第二次开始Focus() 现在可以正常工作了。

    MainAutoSuggestBox.Visibility = Visibility.Visible;
    MainAutoSuggestBox.Focus(FocusState.Programmatic);

有几种方法可以解决此问题。首先是订阅SizeChanged 事件,然后在处理程序中,当旧尺寸为&lt;0,0&gt; 而新尺寸为其他尺寸时,您知道它已完成渲染,调用Focus()在那里。

或者更简单,不要在 XAML 中将其设置为 Collapsed,而是在 Loaded 事件处理程序中设置,因为它将在折叠之前完全呈现 -

MainAutoSuggestBox.Loaded += (s, e) => MainAutoSuggestBox.Visibility = Visibility.Collapsed;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2017-07-27
    • 2015-11-29
    • 2016-04-09
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多