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

在调试过程中,我发现第一次单击该按钮时,
控制流到达MainAutoSuggestBox.Focus(FocusState.Programmatic);内的行HandleSearchButtonClick(),但从未达到

private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e)


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

private void MainAutoSuggestBox_GotFocus(object sender, RoutedEventArgs e)


方法。

最佳答案

首先让我们弄清楚为什么不是第一次设置焦点。

首先,订阅LoadedMainAutoSuggestBox事件,在处理程序中,您会发现RenderSizeMainAutoSuggestBox<0,0>。这是有道理的,因为您已在XAML中将控件的Visibility设置为Collapsed,从而导致控件忽略所有大小更改事件。

因此,在第一次按下下面的代码的第二行时,尽管Visibility设置为Visible,但控件尚未完全呈现,因此以下Focus()将无效。之后,控件完成了渲染,这就是为什么Focus()从第二次开始可以正常工作的原因。

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




有几种方法可以解决此问题。首先是预订SizeChanged事件,然后在处理程序中,仅当旧大小为<0,0>而新大小为其他大小时,您才知道它已完成渲染,在此调用Focus()

或更简单的做法是,不要在XAML中将其设置为Collapsed,而应在Loaded事件处理程序中进行设置,因为它会在折叠前完全呈现-

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

10-08 14:25