为什么我的文本框包含在 FlipView 中,在弹出时被软键盘遮住了?

Why is my text box contained in a FlipView obscured by the soft keyboard when it pops up?

请考虑以下内容XAML:

<Page x:Class="InputControlsInScrollViewer.WindowsStoreApp.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:l="using:InputControlsInScrollViewer.WindowsStoreApp"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">
    <Page.Resources>
        <Style x:Key="FlipViewItemStyle" TargetType="FlipViewItem">
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="VerticalContentAlignment" Value="Stretch" />
            <Setter Property="TabNavigation" Value="Local" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="FlipViewItem">
                        <Border BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Background="{TemplateBinding Background}">
                            <ScrollViewer IsTabStop="True"
                                          ZoomMode="Disabled"
                                          VerticalScrollMode="Enabled"
                                          HorizontalScrollMode="Disabled"
                                          HorizontalScrollBarVisibility="Disabled"
                                          VerticalScrollBarVisibility="Auto"
                                          IsVerticalRailEnabled="True">
                                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
                                                  ContentTransitions="{TemplateBinding ContentTransitions}"
                                                  Content="{TemplateBinding Content}"
                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                  Margin="{TemplateBinding Padding}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                            </ScrollViewer>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Page.Resources>
    <Page.DataContext>
        <l:MainPageViewModel />
    </Page.DataContext>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <FlipView Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
                  ItemsSource="{Binding Views}" ItemContainerStyle="{StaticResource FlipViewItemStyle}" />

    </Grid>
</Page>

在其中,我有一个以水平模式运行的 FlipView。我想在 FlipView 中显示的内容太大——这就是为什么我在 FlipViewItem 模板中添加了一个 ScrollViewer,以便用户可以垂直滚动(请注意,FlipView 模板内部使用水平 ScrollViewer)。

FlipView 显示的内容包含文本框等输入控件,显然,当用户点击文本框时会显示软键盘(以便获得焦点)。

这是我的实际问题:为什么文本框没有转换为未被软键盘遮挡的剩余视口(见图片)

显然,这与 FlipView 有关,因为当我仅在 ScrollViewer 中显示我的示例视图(或者甚至根本没有 ScrollViewer)时,当软键盘弹出时文本框被正确翻译。

我已经尝试过以下步骤:

  1. 我尝试在 FlipView 模板中的 ScrollViewer 上启用垂直滚动 - 这不起作用,因为 FlipView 似乎覆盖了 OnApplyTemplate(或其他)中的相应值 - 当 FlipView 上的方向时,VerticalScrollMode 被禁用' VirtualizingStackPanel 设置为水平。
  2. 如上所述,我尝试在 ScrollViewer 中显示完全相同的视图(效果很好),甚至在没有 ScrollViewer 的情况下(效果也很好)。
  3. 我也检查了 ScrollViewer.BringIntoViewOnFocusChanged 但这并没有改变任何东西(此外,这个 属性 的默认值设置为 true)。

有什么办法可以避免这个问题吗? 非常感谢您的提前帮助!

我不确定为什么文本框没有向上翻译,但您可以通过自己处理 InputPane 来解决这个问题。

订阅 InputPane.Showing 和隐藏事件。当他们触发动画时,FlipView 的 RenderTransform 向上转换以避开 InputPane 的 OccludedRect 并将 EnsuresedFocusedElementInView 设置为 true 以标记该应用程序已自行处理并且 Windows 不需要再次这样做。

Responding to the appearance of the on-screen keyboard sample 演示了基础知识。

我找到了导致问题的组件:在 FlipView 中用作项目宿主的是 VirtualizingStackPanel。如果您将其与普通 StackPanel 交换,则当软键盘弹出时,输入控件将按预期转换为剩余的视图端口。

您可以通过以下方式兑换VirtualizingStackPanel

只需像这样直接在 FlipView 上设置 ItemsPanel 属性:

<FlipView>
    <FlipView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" AreScrollSnapPointsRegular="True" />
        </ItemsPanelTemplate>
    </FlipView.ItemsPanel>
</FlipView>

如果您有多个 FlipView,在它们之间共享一个样式更为合适:

<Style x:Key="MyFlipViewStyle" TargetType="FlipView">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" AreScrollSnapPointsRegular="True" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意,在这种情况下您将失去 UI 虚拟化,这通常意味着加载 FlipView 控件需要更长的时间,尤其是当您在其中显示大量项目时。

更新:我写了一篇关于这个问题的博客文章 - 在 http://www.feo2x.com/posts/2015-12-06-flipview-and-problems-with-input-controls-part-1/

上阅读更多内容