【问题标题】:Best way to display read-only text in C#在 C# 中显示只读文本的最佳方法
【发布时间】:2010-02-12 15:25:42
【问题描述】:

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

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

【问题讨论】:

标签: c# winforms


【解决方案1】:

不能在锁定时覆盖 ForeColor 和 BackColor 属性吗?

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

【讨论】:

  • 刚刚试过这个,是的,在你将 ReadOnly 属性设置为 True 之后,你确实可以将 BackColor 设置回白色。
  • 我确实在某处看到了此问题的解决方案,它确实对我有用,但由于某种原因,我在实践中遇到了问题。也许与可访问性有关?如果我记得我会更新为什么我没有走这条路(如果它对你有用,那很好,虽然我猜 :-)。
  • 您不应将颜色设置为黑白。而是将它们设置为 BackColor = SystemColors.WindowForeColor = SystemColors.ControlText
【解决方案2】:

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

【讨论】:

  • 我想显示很多从其他地方获取/生成的文本。我想以一种可读的方式显示它(比如这个网站上的文本)。我想要它带有滚动条,因为它超过一页。
  • 使用文本框允许用户选择要复制的文本。惯例确实规定灰色背景上的黑色文本是只读的,但标准文本区域(白色背景上的黑色文本)也是只读的并不罕见。
【解决方案3】:

这实际上在 Windows 上似乎特别可怕,具体取决于您希望达到的程度(例如,如果您希望文本是可选的,如果您希望能够进行文本格式化)。

我前段时间发现了这一点,但很幸运地发现各种博客上都有详细的记录。看来您可以使用 RichTextBox,但要创建事件处理程序以防止最终用户修改其内容。

例如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 的选项。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2010-09-06
    相关资源
    最近更新 更多