2

WPF で textbox/richtextbox コンポーネントを使用しており、追加のテキスト ボックスをインポートする必要があります。現在、追加のカスタム テキスト ボックスを挿入する RichTextbox コントロールを使用しています (他の方法では実行できない式であるため、必要です)。私が抱えている問題は、カーソルがリッチテックスボックス内のテキストボックスに隣接しているときに、テキストボックスに集中する必要があることです。コンポーネントを無視してスキップしているようです。他の誰かがこれに対する解決策を持っていますか?

WPF の RichTexbox 内のカーソルまたはコンポーネントを制御できないようです。

4

2 に答える 2

2

RichTextBox内に埋め込まれているUIComponentは、実際には3つのTextBox(ベース、上付き文字、および下付き文字)を含む数字です。私が抱えていた問題は、カーソルが数字コンポーネントに焦点を合わせることができなかったことでした。

私が探していた機能はこれです。。。

RichTextBox.CaretPosition.GetAdjacentElement(LogicalDirection Direction)

これが私のコードです。。。

public class MathRichTextbox : RichTextBox
{
    public MathRichTextbox()
    {
        this.PreviewKeyDown += MathRichTextbox_PreviewKeyDown;
    }

    void MathRichTextbox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        Digit expr = null;

        switch (e.Key)
        {
            case Key.Left:
                expr = findAdjacentMathDigits(LogicalDirection.Backward);
                break;

            case Key.Right:
                expr = findAdjacentMathDigits(LogicalDirection.Forward);                    
                break;
        }

        if (expr != null)
            this.Dispatcher.BeginInvoke(
                new ThreadStart(() => expr.FocusBase()),
                System.Windows.Threading.DispatcherPriority.Input, null);
    }

    private Digit findAdjacentMathDigits(LogicalDirection direction)
    {
        Digit expr = null;

        if (Selection.Text.Length == 0)
        {
            DependencyObject dpObj = CaretPosition.GetAdjacentElement(
                direction);

            // is it contained in BlockUIContainer?
            expr = CaretPosition.GetAdjacentElement(
                direction) as Digit;

            // is it onctained in a InlineUIContainer?
            if (expr == null)
            {
                InlineUIContainer uiWrapper =
                    CaretPosition.GetAdjacentElement(
                    direction) as InlineUIContainer;

                if (uiWrapper != null)
                    expr = uiWrapper.Child as Digit;
            }

        }

        return expr;
    }

}
于 2012-12-25T08:45:57.083 に答える
1

コメントで述べたように、代わりにRunを使用するようにしてください。

ARunは TextBox と大差ありません。例を挙げましょう:

この文字列 "This is an example" をParagraphRichTextBoxの先頭に追加します。

Paragraph _para //I assume you have this
TextPointer pointer=_para.ContentStart;
Run run=new Run("This is an example",pointer);

それでおしまい。FontSize、FontFamily、および ... などの他のプロパティを設定できますTextBox

run.Foregroung=Brushes.Red;

それが役に立てば幸い。

于 2012-12-25T07:43:58.507 に答える