0

私の Windows 8 Metro プロジェクトでは、ContentControl から派生したクラス (MyControl と呼びましょう) を使用してコンテンツを表示しています。MyControl 内には、ScrollViewer があります。コントロールでキーボード イベントを処理する必要があるため、コントロールにフォーカスを設定できる必要があります。ただし、スクロールビューアーが矢印キーや PageUp/Down などのキーイベントを処理できるようにするオプションも必要です。より正確には、これを別のプログラマーがオンまたはオフにできるオプションにしたいと考えています。これは、MyControl をタブストップにしたい場合もあれば、ScrollViewer をタブストップにしたい場合もありますが、両方を望んでいないことを意味します。

問題は、MyControl の内部動作を他のプログラマーに公開したくないということです。つまり、理想的には、MyControl.IsTabStop を使用して、(MyControl または ScrollViewer に配置するために) コントロールに実際のタブ ストップを配置するロジックを残すことができる必要があります。

これを達成する良い方法はありますか、それともコントロールをタブストップにする別の関数を提供することで何とか回避する必要がありますか?

4

1 に答える 1

0

私のテスト XAML を見ると、何もしていないことがわかりますが、TextBox の上下キーはテキスト行間を移動するように機能し、移動するテキスト行がない場合は ScrollViewer をスクロールします。これは、KeyDown ハンドラーがキー イベントをバブルアップさせたくない場合 (TextBox が既に処理した場合など) に e.Handled 値を true に設定し、イベントが処理されない場合は false のままにすることで実現される可能性があります。 ScrollViewer がそれを処理します。イベントは、フォーカスがある場合は常に TextBox でトリガーされますが、処理されない場合はビジュアル ツリーがバブルアップします。重要なイベントを処理済みとしてマークするかどうかを決定するだけで、何もする必要はないようです。

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <ScrollViewer
        IsTabStop="True">
        <Grid
            Width="2000"
            Height="2000">
            <Button
                Margin="149,342,0,311">
                <Button>
                    <TextBox
                        AcceptsReturn="True"
                        Height="400"
                        Width="200"/></Button>
            </Button>
        </Grid>
    </ScrollViewer>
</Grid>
于 2012-11-16T18:59:27.770 に答える