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