10

登録フォームを含むアプリケーションに取り組んでいます。フォームには複数のテキスト入力ボックスが含まれているため、ScrollViewer を使用してそれらすべてを 1 ページに表示できるようにします。

以下は、私が使用している 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 はグリッド セル内にあることに注意してください。つまり、タイトル パネルは常にオンスクリーンのままにする必要があります)。

スクロールは問題なく動作するので問題ありません。ただし、ユーザーがデータを入力するために TextBox を選択すると (つまり、ソフト キーボードが開く)、システムはページ全体のコンテンツ (登録タイトル パネルを含む) をプッシュしますが、これは予期された動作ではありません。[Windows Phone の People アプリを見て、新しい連絡先を追加してみてください。これには同様の構造が含まれていますが、ScrollViewer はスクロールビューアー内のコンテンツを押し上げるだけで正しく動作します]

テストケース

  • 画面の上部近くに表示されている TextBox を選択して、キーボードを開きます。
  • キーボードを開いた状態で、ページの一番下までスクロールしてみます。
  • ページの下部にあるアイテムにはアクセスできません。

また

  • 画面の下部近くに表示されている TextBox を選択します。
  • ページ全体のコンテンツが押し上げられます。
  • キーボードを開いた状態で、ページの上部までスクロールしてみます。
  • ページ上部の項目にはアクセスできず、キーボードを閉じるまでタイトル パネルは表示されません。

この問題を解決するための助けをいただければ幸いです。ありがとう。

4

4 に答える 4

0

問題は、キーボードが表示された後に ScrollViewer の高さが変更されないため、クリップされてしまうことです。解決策の 1 つは、(キーボードの高さに応じて) scrollviewer の高さを変更してから、再配置することです (これは頭痛の種になる可能性があります)。

もう 1 つの問題は、キーボードがいつ表示されるかを知ることです。すべての 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

これが少し役立つことを願っています:)

于 2012-08-31T12:56:22.387 に答える
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();
    }
于 2012-10-29T14:45:38.967 に答える
0

私の小さなライブラリを見てください - https://siphelper.codeplex.com/

scrollviewer の高さを変更し、コンテンツを最上部/最下部までスクロールできます。

ご提案がありましたら、お気軽にお問い合わせください。

于 2013-07-10T09:45:28.997 に答える