如何防止某些格式被粘贴到WPF RichTextBox中

时间:2011-02-19 01:02:30

标签: wpf formatting richtextbox

我想在WPF RichTextBox中允许一些简单的格式化命令,但不允许其他命令。

我创建了一个工具栏,允许用户应用粗体或斜体,并使用项目符号或编号列表。 (基本上,我只想支持适用于博客或维基的格式化命令。)

问题是用户可以执行剪切和粘贴操作,插入带有前景色和背景色的文本,以及其他类型的不允许的格式。这可能导致令人讨厌的可用性问题,例如用户将白色文本粘贴到白色背景上。

有没有办法关闭这些高级格式化功能?如果没有,有没有办法可以拦截粘贴操作并删除我不想要的格式?

2 个答案:

答案 0 :(得分:5)

您可以截取粘贴操作,如下所示:

    void AddPasteHandler()
    {
        DataObject.AddPastingHandler(richTextBox, new DataObjectPastingEventHandler(OnPaste));
    }

    void OnPaste(object sender, DataObjectPastingEventArgs e)
    {
        if (!e.SourceDataObject.GetDataPresent(DataFormats.Rtf, true)) return;
        var rtf = e.SourceDataObject.GetData(DataFormats.Rtf) as string;
        // Change e.SourceDataObject to strip non-basic formatting...
    }

而凌乱的部分是保留一些但不是全部的格式。 rtf变量将是RTF格式的字符串,您可以使用第三方库来解析,使用类似DOM的模式遍历树,并使用文本,粗体和斜体发出新的RTF。然后将其填入e.SourceDataObject或其他一些选项(请参阅下面的文档)。

以下是PastingHandler个文档:

以下是许多RTF解析器之一:

答案 1 :(得分:3)

如果您要从粘贴的内容中删除所有格式(不是您提出的问题,但可能对某人有用),请输入以下代码:

    void OnPaste(object sender, DataObjectPastingEventArgs e)
    {
        if (!e.SourceDataObject.GetDataPresent(DataFormats.Rtf, true)) return;
        var rtf = e.SourceDataObject.GetData(DataFormats.Rtf) as string;

        FlowDocument document = new FlowDocument();
        document.SetValue(FlowDocument.TextAlignmentProperty, TextAlignment.Left);

        TextRange content = new TextRange(document.ContentStart, document.ContentEnd);

        if (content.CanLoad(DataFormats.Rtf) && string.IsNullOrEmpty(rtf) == false)
        {
            // If so then load it with RTF
            byte[] valueArray = Encoding.ASCII.GetBytes(rtf);
            using (MemoryStream stream = new MemoryStream(valueArray))
            {
                content.Load(stream, DataFormats.Rtf);
            }
        }

        DataObject d = new DataObject();
        d.SetData(DataFormats.Text, content.Text.Replace(Environment.NewLine, "\n"));
        e.DataObject = d;
    }
}