UWP专注于AutoSuggestBox

时间:2017-06-21 09:17:31

标签: c# xaml uwp

我的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;
        }    
    }
}

现在的问题是当我点击按钮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)

方法

1 个答案:

答案 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()