Добавление текста в RichTextBox в конструкторе

1

Я создаю специальный вид текстового поля, наследуя его от RichTextBox. Я хотел бы иметь возможность установить исходный текст в поле, которое, как я думал, я мог бы сделать в конструкторе следующим образом:

class SpecialTextBox : RichTextBox
{
    public SpecialTextBox()
    {
        BackColor = System.Drawing.Color.ForestGreen;
        AppendText("Initial Text...");
        Text += "and some more initial text.";
    }
}

Конструктор в приведенном выше коде устанавливает цвет фона, но исходный текст не отображается. Мой вопрос в том, почему текст не появляется, и как я могу это достичь? Мне может потребоваться, чтобы исходный текст настраивался (возможно, передавался конструктору).

Я могу успешно добавить текст позже, позвонив

specialTextBox1.AppendText("This text will appear.")

Почему текст конструктора не отображается?

  • 1
    Не могли бы вы показать код AppendText?
  • 0
    @Anton: AppendText () является частью библиотеки .NET; это стандартный метод в TextBox.
Показать ещё 5 комментариев
Теги:
winforms

5 ответов

2
Лучший ответ

Windows перезаписывает текст внутри FlowDocument когда он загружает XAML для него. Это происходит после RichTextBox конструктора для RichTextBox.

Попробуйте добавить текст чуть позже, например, в событие Loaded:

public class SpecialTextBox : RichTextBox
{
    public SpecialTextBox()
    {
        Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(
            System.Drawing.Color.ForestGreen.A,
            System.Drawing.Color.ForestGreen.R,
            System.Drawing.Color.ForestGreen.G,
            System.Drawing.Color.ForestGreen.B));

        this.Loaded += new RoutedEventHandler(SpecialTextBox_Loaded);
    }

    void SpecialTextBox_Loaded(object sender, RoutedEventArgs e)
    {
        AppendText("Initial Text...");
    }
}

Обновление: вы можете захотеть сделать это только в том случае, если загруженный XAML не имеет исходного текста:

    void SpecialTextBox_Loaded(object sender, RoutedEventArgs e)
    {
        var range = new TextRange(Document.ContentStart, Document.ContentEnd);
        if (range.IsEmpty)
        {
            AppendText("Initial Text...");
        }
    }

Обновить

ОК, WinForms. WinForms задает начальный текст в коде С#, сгенерированном дизайнером. Вы должны увидеть что-то вроде этого:

        this.richTextBox1 = new WinformsRichTextBox.SpecialTextBox();
        this.SuspendLayout();
        // 
        // richTextBox1
        // 
        this.richTextBox1.Location = new System.Drawing.Point(12, 2);
        this.richTextBox1.Name = "richTextBox1";
        this.richTextBox1.Size = new System.Drawing.Size(1233, 507);
        this.richTextBox1.TabIndex = 0;
        this.richTextBox1.Text = "";

Последняя строка - это то, что побеждает ваш конструктор. Вы можете взломать это, переопределив метод Text и отклонив начальную настройку:

public class SpecialTextBox : RichTextBox
{
    bool suppressInitialSetText = true;

    public SpecialTextBox()
    {
        BackColor = System.Drawing.Color.ForestGreen;
        AppendText("Initial Text...");

        this.VisibleChanged += new EventHandler(SpecialTextBox_VisibleChanged);
    }

    void SpecialTextBox_VisibleChanged(object sender, EventArgs e)
    {
        // Just in case, once the control becomes visible disable the kludge.
        if (Visible)
            suppressInitialSetText = false;
    }

    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            if (!suppressInitialSetText || !string.IsNullOrEmpty(value) || Parent != null)
                base.Text = value;
            suppressInitialSetText = false;
        }
    }
}

В этой схеме "Начальный текст..." появляется только в том случае, если строка "Текст" в конструкторе форм пуста. В противном случае текст в конструкторе форм переопределяет текст в конструкторе.

Кажется, что-то хрупкое и клочья.

  • 0
    Я вижу, откуда ты. Хотя для элемента управления нет загруженного события (я думаю, что это событие применимо только к форме?). Возможно, есть другое подобное событие, которое запускает RichTextBox ... Я посмотрю.
  • 0
    @Siskin - подожди - это WPF или WinForms? Я думал, что это был WPF, но это может быть ошибочным предположением.
Показать ещё 1 комментарий
2

Так что "Исходный текст..." не появляется, но "и еще один исходный текст". делает? На первый взгляд кажется, что вы сбиваете первую строку, назначая вторую... кроме того, что вы используете оператор + =, а не =.

Я никогда не использовал метод AppendText, но я могу предложить некоторые догадки:

  1. Может быть, AppendText не работает, если свойство Text пустое? Итак, результат вызова здесь - ничто?
  2. Может быть, AppendText изменяет отображение, но не свойство Text? Итак, текст остается пустым, когда вы добавляете вторую строку, которая затем обновляет отображение, чтобы показать текст?

Попробуйте прокомментировать строку Text + =... и посмотрите, отображает ли она первую. Также поставьте точку останова непосредственно перед и после AppendText, чтобы узнать, что происходит с текстом.

  • 0
    Извините, мой начальный пост был не совсем понятен. Ни одно из утверждений в конструкторе не производит никакого текста.
  • 0
    Ой. Тогда проблема, вероятно, не в приложении AppendText напрямую, а в том, что касается dbc. Еще может быть интересно посмотреть, что происходит с текстом в каждой точке - до, между и после этих двух строк - просто для того, чтобы убедиться, что там нет ничего глупого.
1

Я добавил ваш класс в проект Windows Forms и добавил его в форму в событии Load. Кажется, он работает так, как ожидалось. Как вы добавили SpecialTextBox в свою форму?

Это то, на что похоже мое событие загрузки.

    private void Form1_Load(object sender, EventArgs e)
    {
        SpecialTextBox stb = new SpecialTextBox();
        this.Controls.Add(stb);
        stb.Visible = true;
    }

Это выглядит класс.

    class SpecialTextBox : System.Windows.Forms.RichTextBox
    {
        public SpecialTextBox()
        {
            BackColor = System.Drawing.Color.ForestGreen;
            AppendText("Initial Text...");
            Text += "and some more initial text.";
        }
    }
  • 0
    Привет, Майк, спасибо за информацию. Я добавляю SpecialTextBox в форму с помощью графического интерфейса WinForms Designer, что, как мне кажется, является проблемой: сгенерированный код переопределяет исходный текст всем, что я мог бы поместить в конструктор.
  • 0
    @Siskin - да, если вы посмотрите на файл исходного кода "Form1.Designer.cs", вы увидите строку вроде this.richTextBox1.Text = "";
1

Это вызвано созданным конструктором кодом в.designer.cs вашей формы, содержащей ваш SpecialTextBox.

Чтобы настроить этот код, вы можете определить пользовательский ControlDesigner и переопределить InitializeNewComponent следующим образом:

internal class SpecialTextBoxDesigner
 : System.Windows.Forms.Design.ControlDesigner
{
    public override void InitializeNewComponent(
        System.Collections.IDictionary defaultValues)
    {
        base.InitializeNewComponent(defaultValues);
        this.Control.Text = "Initial Text...";
    }
}

Затем примените это к DesignerAttribute к вашему SpecialTextBox:

[System.ComponentModel.Designer(typeof(SpecialTextBoxDesigner))]
public partial class SpecialTextBox : RichTextBox

Вам нужно добавить ссылку на System.Designer в свой проект заранее.

1

В конструкторе вы можете установить исходный текст как

base.Text = "Текст, что вы хотите";

  • 0
    Привет Кишоре, спасибо за предложение, но это не похоже на работу.
  • 1
    у вас есть два варианта, чтобы решить эту проблему. 1. Вместо добавления этого customrichtexbox в форму во время разработки. добавьте код через форму или элемент .controls.add (yourcontrolinstance) или 2. если вы добавите его при проектировании, то в окне свойств обновите свойство text до исходного статического текста

Ещё вопросы

Сообщество Overcoder
Наверх
Меню