在C#中显示只读文本的最佳方式

时间:2010-02-12 15:25:43

标签: c# winforms

在文本框中显示将属性Enabled设置为false或只读设置为true的文本会在灰色文本上生成黑色,这根本不适合阅读。

在Windows窗体中显示只读文本的最简单方法是什么?

3 个答案:

答案 0 :(得分:7)

当它被锁定时,你不能覆盖ForeColor和BackColor属性吗?

如果失败,请创建自己的文本框类,该类监听KeyUp事件并在ReadOnly(或Locked)属性设置为true时拦截按键(防止将其添加到文本中)。然后您可以使用任何样式你喜欢。

答案 1 :(得分:0)

...嗯 使用标签? 为什么要使用文本框,并使其看起来不可编辑? 你想让用户感到困惑吗? 违反习惯用户界面风格习语会自担风险。

答案 2 :(得分:0)

这在Windows上看起来实际上是非常可怕的,具体取决于您希望转到的程度(例如,如果您希望文本可以选择,如果您希望能够进行文本格式化)。

我前段时间发现了这一点,但幸运的是发现恐怖在各种博客上得到了充分的记录。您似乎可以使用RichTextBox,但创建事件处理程序以防止最终用户修改其内容。

e.g。 RichTextBox名为“myRichTextBox”,然后您需要将以下内容添加到Designer.cs中:

this.myRichTextBox.SelectionChanged += new System.EventHandler(this.MyRichTextBox_Deselect);
this.myRichTextBox.DoubleClick += new System.EventHandler(this.MyRichTextBox_Deselect);
this.myRichTextBox.GotFocus += new System.EventHandler(this.MyRichTextBox_Deselect);
this.myRichTextBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.MyRichTextBox_LinkClicked);

然后你想在你的表单中创建如下的方法:

public void MyRichTextBox_Deselect(object sender, EventArgs e)
{
    // When user tries to select text in the rich text box, 
    // set selection to nothing and set focus somewhere else.
    RichTextBox richTextBox = sender as RichTextBox;
    richTextBox.SelectionLength = 0;
    richTextBox.SelectionStart = richTextBox.Text.Length;
    // In this case I use an instance of separator bar on the form to switch focus to.
    // You could equally set focus to some other element, but take care not to
    // impede accessibility or visibly highlight something like a label inadvertently.
    // It seems like there should be a way to drop focus, perhaps to the Window, but
    // haven't found a better approach. Feedback very welcome.
    mySeperatorBar.Focus();
}

public void MyRichTextBox_LinkClicked(object sender, LinkClickedEventArgs e)
{
    System.Diagnostics.Process.Start(e.LinkText);
}

显然你可能不关心LinkClickedEventHandler()处理程序,但我确信这个功能很常见,因为RichTextBox控件可以选择自动识别和着色URL。

我不知道为什么似乎没有更优雅的解决方案,并欢迎任何知道更好方法的人提供意见。