DotNet中的文本框/ RichTextbox中的组件

时间:2012-12-25 02:42:27

标签: c# wpf richtextbox

我正在使用WPF中的textbox / richtextbox组件,我需要将其他文本框导入其中。目前,我使用RichTextbox控件插入其他自定义文本框(它们是必需的,因为它是一个无法以其他方式完成的表达式)。我遇到的问题是,当光标与richtexbox内部的文本框相邻时,我需要关注文本框。它似乎忽略了组件并跳过它。还有其他人有解决方案吗?

我似乎无法控制WPF中RichTexbox内的游标或组件。

2 个答案:

答案 0 :(得分:2)

嵌入在RichTextBox中的UIComponent实际上是一个包含3个TextBox(base,superscript和subscript)的数字。我遇到的问题是光标无法聚焦到数字组件中。

我正在寻找的功能就是这个。 。

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;
    }

}

答案 1 :(得分:1)

正如我在评论中所说,你应该尝试使用Run代替。

Run与TextBox没有太大区别。让我举个例子:

您想在RichTextBox的Paragraph开头添加此字符串“This is a example”:

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;

希望它有所帮助。