2

WPFTextBoxコントロールのコンテンツに装飾を追加する必要があります。これは基本的には問題なく機能します。指定された文字インデックスの位置を取得し、それに応じて他の要素をレイアウトできます。ただし、TextBoxをスクロールすると、すべてが壊れます。他の場所に移動したため、レイアウト位置が表示されたテキストと一致しなくなりました。

ここで、TextBoxクラスがそのスクロール状態に関する情報も、スクロールが変更されたときのイベントも提供しないことにかなり驚いています。私は今何ができますか?

Snoopを使用して、尋ねることができるスクロールサブ要素があるかどうかを調べましたが、ScrollContentPresenterにも利用可能なスクロール情報がありません。スクロールが影響を与えるように、装飾要素をスクロール領域に配置したいのですが、コンテンツコントロールは1つしか存在できず、それはすでにTextBox内部の1つです。

4

2 に答える 2

7

テキストボックスがスクロールされたときにイベントをキャプチャする方法がわかりませんが(おそらくnarohiの回答を使用してください)、現在のスクロール位置を確認する簡単な方法があります:

// Gets or sets the vertical scroll position.
textBox.VerticalOffset

( http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.textboxbase.verticaloffset(v=vs.100).aspxから)

次のように、テキストボックスが最後までスクロールされているかどうかを確認するために使用しています。

public static bool IsScrolledToEnd(this TextBox textBox)
{
    return textBox.VerticalOffset + textBox.ViewportHeight == textBox.ExtentHeight;
}
于 2014-02-05T16:50:26.283 に答える
1

このメソッドを使用して、テキスト ボックスに引数として ScrollViewer を渡し、タイプ ScrollViewer を取得できます。その後、ScrollChanged イベントをサブスクライブできます。

public static T FindDescendant<T>(DependencyObject obj) where T : DependencyObject
{
    if (obj == null) return default(T);
    int numberChildren = VisualTreeHelper.GetChildrenCount(obj);
    if (numberChildren == 0) return default(T);

    for (int i = 0; i < numberChildren; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child is T)
        {
            return (T)(object)child;
        }
    }

    for (int i = 0; i < numberChildren; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        var potentialMatch = FindDescendant<T>(child);
        if (potentialMatch != default(T))
        {
            return potentialMatch;
        }
    }

    return default(T);
}

例:

public MainWindow()
{
    InitializeComponent();
    Loaded += new RoutedEventHandler(MainWindow_Loaded);
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    ScrollViewer s = FindDescendant<ScrollViewer>(txtYourTextBox);
    s.ScrollChanged += new ScrollChangedEventHandler(s_ScrollChanged);
}

void s_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    // check event args for information needed
}
于 2013-02-15T22:28:50.217 に答える