0

その周りのスクロールビューア内に Textblock があります。私のアプリケーションはリモートで完全に制御されるため、このコンテキストではナビゲーションは上下左右のキーで実行されます。

Textblock に移動できますが、そこに閉じ込められます。KeyboardNavigation.DirectionalNavigation="Continue" をすべてのコントロールに配置しようとしましたが、喜びはありません。

次に、スクロールバーまたはスクロールビューアーを拡張するカスタム コントロールを作成することを考えました。スクロールバーを拡張する場合、次のようにキーダウンをオーバーライドできます。

protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (this.Orientation == Orientation.Vertical)
        {
            if (e.Key == Key.Up)
            {
                if (this.Value == this.Minimum)
                {
                    this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
                    e.Handled = true;
                }
            }
            if (e.Key == Key.Down)
            {
                if (this.Value == this.Maximum)
                {
                    this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
                    e.Handled = true;
                }
            }
            if (e.Key == Key.Left)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));
                e.Handled = true;
            }
            if (e.Key == Key.Right)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));
                e.Handled = true;
            }
        }

        if (this.Orientation == Orientation.Horizontal)
        {
            if (e.Key == Key.Left)
            {
                if (this.Value == this.Minimum)
                {
                    this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));
                    e.Handled = true;
                }
            }
            if (e.Key == Key.Right)
            {
                if (this.Value == this.Maximum)
                {
                    this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));
                    e.Handled = true;
                }
            }
            if (e.Key == Key.Up)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
                e.Handled = true;
            }
            if (e.Key == Key.Down)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
                e.Handled = true;
            }
        }
        base.OnPreviewKeyDown(e);
    }
}

問題は、ScrollViewer スクロールバーを変更してカスタム スクロールバーを使用する方法がわからないこと、またはキーが押されたときに上記のコードが起動することさえわからないことです。テキストブロックとスクロールビューアがイベントを見るコントロールになると思います。

上記のコードと同様のことを行う方法はありますが、Scrollviewers のコード ビハインドでしょうか?

4

1 に答える 1

1

カスタムコントロールを作成することで、最終的にこれを解決しました。キーが押された方向にスクロールビューアがスクロールできるかどうかを調べます。はいの場合、イベントは下層のスクロールビューアに渡されます。そうでない場合、イベントは処理済みとしてマークされ、フォーカスはキーが押された方向に移動します。

public class KNScrollViewer : ScrollViewer
{
    static KNScrollViewer()
    {

    }

    private bool canScrollUp
    {
        get
        {
            return this.ScrollableHeight > 0 && this.VerticalOffset > 0;
        }
    }

    private bool canScrollDown
    {
        get
        {
            return this.ScrollableHeight > 0 &&
              this.VerticalOffset + this.ViewportHeight < this.ExtentHeight;
        }
    }

    private bool canScrollLeft
    {
        get
        {
            return this.ScrollableWidth > 0 && this.HorizontalOffset > 0;
        }
    }

    private bool canScrollRight
    {
        get
        {
            return this.ScrollableWidth > 0 &&
            this.HorizontalOffset + this.ViewportWidth < this.ExtentWidth;
        }
    }

    public bool CanScroll
    {
        get
        {
            if (canScrollUp || canScrollDown || canScrollLeft || canScrollRight)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Up)
        {
            if (!canScrollUp)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
                e.Handled = true;
            }
        }
        if (e.Key == Key.Down)
        {
            if (!canScrollDown)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
                e.Handled = true;
            }
        }
        if (e.Key == Key.Left)
        {
            if (!canScrollLeft)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));
                e.Handled = true;
            }
        }
        if (e.Key == Key.Right)
        {
            if (!canScrollRight)
            {
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));
                e.Handled = true;
            }
        }
    }
}
于 2012-05-02T16:47:37.123 に答える