XAML 无法在弹出型按钮内的TextBox控件中输入文本

jucafojl  于 2023-08-01  发布在  其他
关注(0)|答案(3)|浏览(98)

我想用CommandBar和一个Flyout来构建这样的东西。


的数据
用户应单击CommandBarFlyout打开)中的按钮,然后在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>

字符串

7lrncoxx

7lrncoxx1#

AppBarButton上将AllowFocusOnInteraction属性设置为true

XAML中的解决方案(如果应用程序最小目标版本为10.0.14393或更高版本)

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

字符串
如果应用的最低版本低于周年更新1607(内部版本10.0.14393)(即使您的目标版本为1607或更高版本),您也无法直接在XAML中设置AllowFocusOnInteraction属性。相反,您应该在代码隐藏中执行此操作。

C#代码隐藏解决方案

// check if the AllowFocusOnInteraction property is available on the platform 
if (Windows.Foundation.Metadata.ApiInformation.IsPropertyPresent("Windows.UI.Xaml.FrameworkElement", "AllowFocusOnInteraction"))
     myAppBarButton.AllowFocusOnInteraction = true;


您还可以将其 Package 到附加属性中,即使在旧的Windows 10版本上也可以在XAML中使用。

更多信息

这是Windows 10周年更新(1607),内部版本14393上的 * 新功能 *。
这对大多数应用栏的使用来说是一个改进,但会干扰你的使用,所以当你把你的构建版本改为14393而不是10586时,你需要覆盖默认值。
这是一篇博客文章ComboBox on a Flyout attached to an AppBarButton loses mouse input on 1607。它还包含附加属性实现。

vhmi4jdf

vhmi4jdf2#

你的文本框实际上从来没有得到焦点,不知何故弹出阻止它,唯一的行动,我可以从这个文本框是指针状态-使它看起来像它有焦点,但它不是。
您需要在代码中设置焦点,例如当弹出按钮打开时-它可以工作,但可能不是最好的解决方案,因为您需要命名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>

字符串
然后是code behind:

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

7cwmlq89

7cwmlq893#

我可以重现这个问题。我认为这是周年更新(1607)SDK(14393)中的一个错误,因为如果我将目标SDK降级到10586,everythink工作正常。
ps.:我不知道如何向微软报告这个bug。

相关问题