Невозможно ввести текст в элементе управления TextBox внутри вылета

Я хочу использовать CommandBar и Flyout для создания чего-то подобного.

search flyout

Пользователь должен нажать кнопку в CommandBar (Flyout открывается), затем ввести текст в TextBox, а затем нажать кнопку справа от TextBox, чтобы начать поиск. Проблема в том, что когда я нажимаю на TextBox, я не могу ввести текст. Кажется, что он теряет фокус, прежде чем я что-то могу написать. Ниже приведен пример кода. Что не так?

<Page.Resources>
    <DataTemplate x:Key="Search">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="200" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBox Grid.Column="0" />
            <AppBarButton Grid.Column="1" Icon="Find" />
        </Grid>
    </DataTemplate>
</Page.Resources>

<Grid>
    <CommandBar RequestedTheme="Dark">
        <AppBarButton Icon="Find">
            <AppBarButton.Flyout>
                <Flyout Placement="Bottom" >
                    <ContentPresenter ContentTemplate="{StaticResource Search}"/>
                </Flyout>
            </AppBarButton.Flyout>
        </AppBarButton>
    </CommandBar>
</Grid>

Ответ 1

Задайте для свойства AllowFocusOnInteraction значение true на AppBarButton.

Решение в XAML (для Windows 10, версия 1607)

    <AppBarButton x:Name="myAppBarButton"
                  Icon="Find"
                  AllowFocusOnInteraction="True">
        <AppBarButton.Flyout>
            <Flyout Placement="Bottom" >
                <ContentPresenter ContentTemplate="{StaticResource Search}"/>
            </Flyout>
        </AppBarButton.Flyout>
    </AppBarButton>

или если вы настроите обновление 10-летней версии Windows 10 (1607) build 14393 или выше, но приложение минимальная версия Windows 10 ниже, вы должны проверить, t20 > доступно на платформе.

Поэтому вы не можете установить свойство AllowFocusOnInteraction в XAML. Вместо этого сделайте это в коде:

Решение в С# code-behind

if (Windows.Foundation.Metadata.ApiInformation.IsPropertyPresent("Windows.UI.Xaml.FrameworkElement", "AllowFocusOnInteraction"))
     myAppBarButton.AllowFocusOnInteraction = true;

Вы также можете перенести его в прикрепленное свойство, которое можно использовать в XAML даже на всех версиях Windows 10.

Подробнее

У вас появилась новая функция в обновлении Windows 10 Anniversary (1607), сборке 14393.

Что улучшение для большинства приложений использует, но мешает вам, поэтому вам нужно переопределить значение по умолчанию, когда вы измените свою сборку на 14393 вместо 10586.

Здесь сообщение в блоге ComboBox на выходе, прикрепленном к AppBarButton, теряет ввод мыши на 1607. Он также содержит реализацию прикрепленного свойства.

Ответ 2

ваш TextBox на самом деле никогда не получает фокус вообще, как-то всплывающее предупреждение предотвращает его, единственным действием, которое я могу получить от этого TextBox, является состояние PointerOver, заставляя его выглядеть так, будто у него есть фокус, но это не так.

Вам нужно установить фокус в коде, например, когда всплывающее окно открывается - оно работает, но может быть не самым приятным решением, потому что вам нужно называть TextBox, чтобы получить его из кода.

<Grid>
    <CommandBar RequestedTheme="Dark">
        <AppBarButton Icon="Find">
            <AppBarButton.Flyout>
                <Flyout Placement="Bottom" Opened="FlyoutBase_OnOpened">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <TextBox x:Name="Test"/>
                        <AppBarButton Grid.Column="1" Icon="Find"/>
                    </Grid>
                </Flyout>
            </AppBarButton.Flyout>
        </AppBarButton>
    </CommandBar>
</Grid>

а затем код позади:

private void FlyoutBase_OnOpened(object sender, object e)
{
    Test.Focus(FocusState.Programmatic);
}

Ответ 3

Я могу воспроизвести проблему. Я думаю, что это ошибка в обновлении юниверса обновления (1607) SDK (14393), потому что если я снижу целевой SDK до 10586, все будут работать нормально.

ps.: Я не знаю, как сообщить об этой ошибке Microsoft.