【问题标题】:How to retain colors of texts in rich text box?如何保留富文本框中文本的颜色?
【发布时间】:2012-02-15 19:50:04
【问题描述】:

我使用以下代码在富文本框中添加了一些彩色文本:

richTextBox1.SelectionColor = Color.Blue;
richTextBox1.SelectedText = "Name";
richTextBox1.SelectionColor = Color.Black;
richTextBox1.SelectedText = ": some message.";

但是当我通过将它的父属性设置为 null 来隐藏用户的富文本框(我有这个面板不时保存不同的富文本框)并将它放回去时,富文本框不保留文本我应用的颜色。所有文本都变成黑色。

更新:我尝试了一个实验。在我的主程序中,我有一个 UserControl(它有一个面板),我在其中放置了一个带有彩色文本的 RichTextBox。我有许多 RichTextBoxes 存储到 HashTable。

所以当我需要一个 RichTextBox 时,我从我的 HashTable 中检索它,将一些彩色文本放入其中,将其放入我的 UserControl 的面板中,最后将我的 UserControl 放入我的程序的表单中。当用户单击按钮时,我的 UserControl 实际上可以从程序的表单中临时删除,我使用 Controls.Remove()。要将其放回我的表单中,我使用 Controls.Add()。问题是,当重新添加 UserControl 时,RichTextBox 的文本不再着色。

我尝试在另一个实验程序中做类似的事情。

public partial class Form1 : Form
{

private chat.UserControl1 ChatWindowKuno = new chat.UserControl1();
private Hashtable htChatLogs = new Hashtable(30);

public Form1()
{
    InitializeComponent();
    createRTBox();
}

private void createRTBox()
{
    RichTextBox richTextBox1 = new RichTextBox();
    richTextBox1.Multiline = true;
    richTextBox1.Dock = DockStyle.Fill;
    richTextBox1.ReadOnly = true;
    richTextBox1.BackColor = SystemColors.Window;
    htChatLogs.Add("Basta", richTextBox1);
}        

private void button1_Click_1(object sender, EventArgs e)
{
    if (ChatWindowKuno.Parent == null)
        ChatWindowKuno.Parent = tabPage2;
    else
        ChatWindowKuno.Parent = null;
}

private void button2_Click(object sender, EventArgs e)
{
    // Clear all text from the RichTextBox;

    RichTextBox richTextBox1 = (RichTextBox)htChatLogs["Basta"]; 

    richTextBox1.Clear();

    richTextBox1.SelectionFont = new Font("Segoe UI", 8.25F, FontStyle.Regular);
    richTextBox1.SelectionColor = Color.Blue;
    richTextBox1.SelectedText = "Xel";
    richTextBox1.SelectionColor = Color.Black;
    richTextBox1.SelectedText = ": Listening to Be My Last by Utada Hikaru.";
    richTextBox1.SelectionColor = Color.Gray;
    richTextBox1.SelectionFont = new Font("Segoe UI", 8.25F, FontStyle.Italic);
    richTextBox1.SelectedText = " [5:56pm] \n";

    richTextBox1.SelectionColor = Color.Gray;
    richTextBox1.SelectedText = "[5:56pm] ";
    richTextBox1.SelectionFont = new Font("Segoe UI", 8.25F, FontStyle.Regular);
    richTextBox1.SelectionColor = Color.Blue;
    richTextBox1.SelectedText = "Xel";
    richTextBox1.SelectionColor = Color.Black;
    richTextBox1.SelectedText = ": Listening to Be My Last by Utada Hikaru.";

}

private void button3_Click(object sender, EventArgs e)
{
    RichTextBox richTextBox1 = (RichTextBox)htChatLogs["Basta"];
    ChatWindowKuno.ChatLog = richTextBox1;
}
}  

usercontrol1 的 ChatLog 属性是这样的:

    public Control ChatLogPanel
    {
        get
        {
            return panel1.Controls[0];
        }
        set
        {
            panel1.Controls.Clear();
            panel1.Controls.Add(value);
        }
    }

我在我的实验程序中随机点击了 3 个按钮,但文字颜色被保留了。

【问题讨论】:

  • Parent 属性设置为null 确实是一种非常奇怪的“隐藏”控件的方式。你是从哪里学来这种技术的?为什么你更喜欢将Visible 设置为false
  • 我这样做的原因是因为我不只是隐藏控件(在我的例子中是 RichTextBox)。这是因为我有不同的 RichTextBoxes,我根据情况需要一次显示一个。因此,当我实际从面板中删除一个富文本框时,我创建了另一个富文本框。
  • 一个面板可以包含多个控件,因此将所有 RichTextBox 控件添加到面板中,然后通过切换Visible 属性有选择地隐藏/显示它们是没有问题的。
  • 我需要面板一次只显示一个富文本框,填满整个面板。
  • 切换Visible 属性意味着其他属性将不可见。填充整个面板与此无关,由 Dock 属性处理。将其设置为DockState.Fill,使其充满整个面板。

标签: c# winforms richtextbox


【解决方案1】:

您不应该使用Parent 属性来隐藏,而是使用Visible 属性。

如果您使用 richTextBox.Visible = false 隐藏富文本框,它会保留其格式(经过测试)。

编辑:

正如下面的 cmets 中所讨论的,我建议您只使用一个 RichTextBox 并将多个 Rtf 字符串存储在一个 Dictionary(或 Hashtable)中,以模拟不同 RichTextBox'es 的存在。

我的意思的一个例子可以找到Here

【讨论】:

  • 我不能用这个来满足我的需要。我实际上不只是试图隐藏富文本框。我从它的父级(面板)中删除富文本框的原因是因为我需要在该面板中放置另一个富文本框。所以我不能用这个。
  • @Xel:我阅读了您更新的问题。每当创建富文本框时,IMO 只需使用Visible=false 将其添加到面板中。然后,您只需将需要的一个设为可见,而将其他的设为不可见。
  • @Xel:顺便说一句,我认为没有必要将所有这些富文本框都保存在哈希表中。您可以将文本与格式(也称为richtextbox.Rtf 字符串属性)一起保留,然后将其传递给一个单一的richtextbox。这样就可以避免显示/隐藏问题...
  • 我该怎么做?我将在哪里存储“richtextbox.Rtf 字符串属性”并检索它以供以后使用?
  • @Xel:请看一下我为你写的这个例子:pastebin.com/iaE94wQS
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多