Я создаю специальный вид текстового поля, наследуя его от 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.")
Почему текст конструктора не отображается?
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;
}
}
}
В этой схеме "Начальный текст..." появляется только в том случае, если строка "Текст" в конструкторе форм пуста. В противном случае текст в конструкторе форм переопределяет текст в конструкторе.
Кажется, что-то хрупкое и клочья.
Так что "Исходный текст..." не появляется, но "и еще один исходный текст". делает? На первый взгляд кажется, что вы сбиваете первую строку, назначая вторую... кроме того, что вы используете оператор + =, а не =.
Я никогда не использовал метод AppendText, но я могу предложить некоторые догадки:
Попробуйте прокомментировать строку Text + =... и посмотрите, отображает ли она первую. Также поставьте точку останова непосредственно перед и после AppendText, чтобы узнать, что происходит с текстом.
Я добавил ваш класс в проект 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.";
}
}
this.richTextBox1.Text = "";
Это вызвано созданным конструктором кодом в.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 в свой проект заранее.
В конструкторе вы можете установить исходный текст как
base.Text = "Текст, что вы хотите";