Scrollviewer& SIP问题(WP7.5芒果)

时间:2012-05-02 10:49:18

标签: windows-phone-7 scrollviewer soft-keyboard

我正在处理一份包含注册表格的申请表。表单包含多个文本输入框,因此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仅通过滚动查看器中的内容来正确运行]

测试用例

  • 选择靠近屏幕顶部可见的TextBox,以打开键盘。
  • 尝试在键盘打开的情况下滚动到页面底部。
  • 页面底部的项目无法访问。

  • 选择屏幕底部附近可见的文本框。
  • 整个页面的内容被推高。
  • 尝试在键盘打开的情况下滚动到页面顶部。
  • 页面顶部的项目无法访问,标题面板在键盘关闭之前永远不会返回视图。

任何有关解决此问题的帮助都将不胜感激。感谢。

4 个答案:

答案 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)

请查看我的小型图书馆 - https://siphelper.codeplex.com/

它修改了scrollviewer的高度,内容可以滚动到最高/最低点。

如果您有任何建议 - 请随时与我联系。