C# 键盘重叠文本框

C# 键盘重叠文本框,c#,xaml,windows-phone-8,windows-phone,C#,Xaml,Windows Phone 8,Windows Phone,我正在WP8应用程序中为注册文档使用文本框列表 文本框的数量相当大,因此用户必须在它们之间滚动。 为了在一个字段和另一个字段之间导航,我添加了两个ApplicationBaricon,next和previous。按next(下一步)将焦点从list(列表)更改为next textbox(下一个文本框),并使用文本框的高度滚动滚动滚动查看器的内容(在本例中为50) 但是,有时,当将焦点切换到下面的元素时,键盘会覆盖文本框。(内容不会向上滚动) 是否有办法强制文本框在键盘上方移动,即使它处于滚动视图

我正在WP8应用程序中为注册文档使用文本框列表

文本框的数量相当大,因此用户必须在它们之间滚动。 为了在一个字段和另一个字段之间导航,我添加了两个ApplicationBaricon,next和previous。按next(下一步)将焦点从list(列表)更改为next textbox(下一个文本框),并使用文本框的高度滚动滚动滚动查看器的内容(在本例中为50)

但是,有时,当将焦点切换到下面的元素时,键盘会覆盖文本框。(内容不会向上滚动)

是否有办法强制文本框在键盘上方移动,即使它处于滚动视图中

<ScrollViewer x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel>
            <TextBlock Text="{Binding Source={StaticResource LocalizedStrings}, Path=LocalizedResources.STRING_CONTACT}" Margin="10,5" FontWeight="SemiBold" Foreground="#878780"></TextBlock>
            <StackPanel Margin="10,5" Height="190" Background="#F4F3F4">
                <TextBox LostFocus="firstNameTxt_LostFocus_1" GotFocus="firstNameTxt_GotFocus_1" Margin="0,-7" FontSize="23" x:Name="firstNameTxt"   BorderThickness="0" Background="Transparent" InputScope="PersonalFullName"><TextBox>
                <TextBox LostFocus="firstNameTxt_LostFocus_1" GotFocus="firstNameTxt_GotFocus_1" Margin="0,-7" FontSize="23" x:Name="lastNameTxt"    BorderThickness="0" Background="Transparent" InputScope="PersonalFullName"></my:DefaultTextBox>
                <TextBox LostFocus="firstNameTxt_LostFocus_1" GotFocus="firstNameTxt_GotFocus_1" Margin="0,-7" FontSize="23" x:Name="MobileTxt"  BorderThickness="0" InputScope="Number" Background="Transparent" ></TextBox>
                <TextBox LostFocus="firstNameTxt_LostFocus_1" GotFocus="firstNameTxt_GotFocus_1" Margin="0,-7" FontSize="23" x:Name="EmailTxt" BorderThickness="0" Background="Transparent">
        </StackPanel>
</ScrollViewer>

这是WP8上的常见问题。当一个文本框被聚焦时,它将翻译
应用程序的
RootVisual
,以将其显示在视图中。在某些情况下(当剪贴板处于打开状态时,或在您的情况下),这种方法不起作用。解决方法是手动将
RootVisual
转换为
TextBox
GotFocus
LostFocus
事件上所需的垂直偏移

private void TranslateRootVisualY(int yNew)
{      
  var rootFrame = Application.Current.RootVisual as PhoneApplicationFrame;
  rootFrame.RenderTransform = new CompositeTransform() {TranslateY = yNew};
}
在您的情况下,您可以取消自动转换,并在
GotFocus
事件中使
ScrollViewer
滚动到所需的偏移量:

private void firstNameTxt_GotFocus_1(object sender, RoutedEventArgs e)
{
   TranslateRootVisualY(0);
   Dispatcher.BeginInvoke(() =>{
      double destOffset;
      //...calculate destination offset
      ContentPanel.ScrollToVerticalOffset(destOffset);
   });
}

destOffset
可以从发送方和其他函数(如
GetRectFromCharacterIndex

)计算,如果您使用的是WP8.1,一个简单快捷的解决方法是只需在
ScrollViewer
上使用属性,就可以完全消除代码隐藏。非常感谢,我会记住这一点。不幸的是,我需要一个WP8 alse的解决方案。但是考虑到这个问题是随机发生的,在大约15%的情况下,我不希望WP8中有解决方案谢谢!通过手动设置偏移量,我现在可以在任何情况下都将焦点文本框保持在键盘上方。谢谢你的这种方法。在UWP应用程序中,我花了一整天的时间尝试不同的解决方案。罪魁祸首是使用了我们需要的ItemsControl的虚拟化。然而,有了你的“黑客”,我可以得到想要的结果。
private void firstNameTxt_GotFocus_1(object sender, RoutedEventArgs e)
{
   TranslateRootVisualY(0);
   Dispatcher.BeginInvoke(() =>{
      double destOffset;
      //...calculate destination offset
      ContentPanel.ScrollToVerticalOffset(destOffset);
   });
}