c# - 如何让 RichTextBox 只显示文本?

标签 c# .net visual-studio-2008 richtextbox

<分区>

Possible Duplicate:
How to prevent richTextBox to paste images within it?

如果您正在使用 RichtextboxRichtextbox 有几个优点,例如:

we can use color font on it

Setting custom font in a region

Attach files on it.. etc

看图: enter image description here

这是我的问题:

我可以把它设为纯文本吗?

在我的项目中,根本不需要附加文件等。我什至不想在上面附加或粘贴图片,我只想在 Richtextbox

“纯文本”

我该怎么做?

最佳答案

由于 RichTextBox 没有图像或对象集合,您必须使用 RTF 格式代码。 RichTextBox 的所有数据都存储为具有特殊格式代码的纯文本,这由控件通过其 RTF 属性公开。如果您想阅读或更改它,学习这种代码语言是必不可少的,网络上可以轻松获得学习资源,例如,请参阅此概述。 RichTextBox 使用比 MS Word 等几个全功能编辑器更简化的 rtf 代码,因此在操作之前将数据加载到 RTB 通常是有益的,这将删除很多冗余数据。

长话短说,我发现有必要搜索以“pict”或“object”命令开头的 rtf 组。知道组可能是嵌套的,你不能只从那里找到第一个结束组字符,你必须逐个字符地解析字符串,同时保持分组计数以找到这些组的末尾。现在您有足够的信息来删除字符串的那部分。 Rtf 可能包含多个图片/对象组,因此您必须这样做,直到所有的都被删除。这是一个在删除这些组后返回 rtf 字符串的示例函数:

private string removeRtfObjects(string rtf)
{
    //removing {\pict or {\object groups
    string pattern = "\\{\\\\pict|\\{\\\\object";
    Match m = Regex.Match(rtf, pattern);
    while (m.Success) {
        int count = 1;
        for (int i = m.Index + 2; i <= rtf.Length; i++) {
            //start group
            if (rtf(i) == '{') {
                count += 1;
            //end group
            } else if (rtf(i) == '}') {
                count -= 1;
            }
            //found end of pict/object group
            if (count == 0) {
                rtf = rtf.Remove(m.Index, i - m.Index + 1);
                break; // TODO: might not be correct. Was : Exit For
            }
        }
        m = Regex.Match(rtf, pattern);
        //go again
    }
    return rtf;
}

应该什么时候做?您已经提到粘贴,还有插入,这些可以用 KeyDown 事件捕获,您可以在其中获取剪贴板信息并相应地处理它。当您自己处理操作时设置 e.Handled=True 表示控件不应对此组合键进行任何默认处理。这也是您在不破坏用户剪贴板的情况下阻止粘贴图像的方式。示例:

private void RichTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    //aware of Paste or Insert
    if (e.Control && e.KeyCode == Keys.V || e.Shift && e.KeyCode == Keys.I) {
        if (Clipboard.ContainsImage || Clipboard.ContainsFileDropList) {
            //some images are transferred as filedrops
            e.Handled = true;
            //stops here
        } else if (Clipboard.ContainsData(DataFormats.Rtf)) {
            RichTextBox rtbox = new RichTextBox();
            //use a temp box to validate/simplify
            rtbox.Rtf = Clipboard.GetData(DataFormats.Rtf);
            this.RichTextBox1.SelectedRtf = this.removeRtfObjects(rtbox.Rtf);
            rtbox.Dispose();
            e.Handled = true;
        }
    }
}

关于c# - 如何让 RichTextBox 只显示文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321385/

相关文章:

c# - 在极少数情况下,重定向到 ACS 并返回后 Cookie 为空

.net - 在 .NET 中模拟半径服务器

c - 我们如何从命令行构建一个 visual studio 项目

c# - 用于验证确认密码的数据注释

c# - 确定角度是否在 2 个其他角度之间

c# - 返回列表前清除 list 的方法好吗?

c# - .NET 是否具有与 XML 的 Json.NET 类型功能等效的功能?

visual-studio-2008 - Visual Studio 2008 保存文件变慢

asp.net - 从命令行复制 VS2008 "Publish Web Site"

c# - 切换 linq 语法