我正在处理一份包含注册表格的申请表。表单包含多个文本输入框,因此ScrollViewer用于允许它们全部显示在一个页面上。
以下是我正在使用的XAML代码的精简示例:
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="SCROLLVIEWER TEST" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="registration" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<ScrollViewer Grid.Row="1">
<StackPanel>
<TextBlock Text="Hello" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello1" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello2" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello3" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello4" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello5" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello6" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello7" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="Hello8" Margin="12,0,0,0"/>
<TextBox />
<TextBlock Text="END" Margin="12,0,0,0"/>
<TextBox />
</StackPanel>
</ScrollViewer>
</Grid>
(请注意,ScrollViewer位于网格单元格内,这意味着标题面板应始终保持OnScreen)
滚动效果非常好,所以这不是问题。然而,当用户选择TextBox以输入数据(即软键盘打开)时,系统推送整个页面的内容(包括注册标题面板),这不是预期的行为。 [请参阅Windows Phone上的People应用程序并尝试添加新联系人。这包含一个类似的结构,但ScrollViewer仅通过滚动查看器中的内容来正确运行]
测试用例
或
任何有关解决此问题的帮助都将不胜感激。感谢。
答案 0 :(得分:0)
问题是键盘出现后ScrollViwer高度未被修改,因此会被剪裁。一种解决方案是修改scrollVwer的高度(根据键盘高度),然后重新定位(这可能会让你头疼)。
另一个问题是知道键盘何时出现 - 您可以在所有TextBox上注册GotFocus / LostFocus事件,但这不是一个很好的解决方案。这可能会对您有所帮助:http://blogs.msdn.com/b/jaimer/archive/2010/11/05/guessing-if-the-sip-is-visible-in-a-windows-phone-application.aspx
希望这有点帮助:)
答案 1 :(得分:0)
我认为你可以从另一个角度解决问题来解决这个问题。手机将向上滚动页面,以便SIP(软件键盘)永远不会覆盖具有焦点的TextBox。
但是,您可以通过检测ScrollViewer中包含的顶部元素上的触摸事件来强制SIP隐藏,例如:
<ScrollViewer Grid.Row="1">
<StackPanel ManipulationDelta="OnScrollViewerGridManipulationDelta">`
然后,通过将焦点放在隐藏按钮(大小为0x0像素)上,这将强制SIP关闭。然后,您的用户可以按预期向上和向下滚动滚动查看器...
private void OnScrollViewerGridManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e)
{
// This will hide the SIP if it is currently showing.
// We can't do this directly, but we can force this by taking focus away from any of the TextBoxes that may have it.
this.hiddenButton.Focus();
}
答案 2 :(得分:0)
我对我开发的应用程序遇到了同样的问题,我处理它的方法是找出包含输入textbox
的面板的自动高度,然后手动设置高度和在底部添加大约400 - 500像素,使其滚动得很好。效果非常流畅,不会让你的UI看起来“hackish”恕我直言。
在您的情况下,您必须找出LayoutRoot
Grid
的自动高度,然后在第1行的RowDefinition
上手动设置高度 - 记住要额外添加400px(或者看起来适合你的情况。)
为了便于输入,我处理了每个OnKeyDown
的每个TextBox
事件,以便在点击TextBox
时将焦点更改为下一个Enter
。在最后TextBox
我将焦点设置为this.focus(),它将焦点设置到Page并隐藏SIP。
答案 3 :(得分:0)