我想在WPF RichTextBox中允许一些简单的格式化命令,但不允许其他命令。
我创建了一个工具栏,允许用户应用粗体或斜体,并使用项目符号或编号列表。 (基本上,我只想支持适用于博客或维基的格式化命令。)
问题是用户可以执行剪切和粘贴操作,插入带有前景色和背景色的文本,以及其他类型的不允许的格式。这可能导致令人讨厌的可用性问题,例如用户将白色文本粘贴到白色背景上。
有没有办法关闭这些高级格式化功能?如果没有,有没有办法可以拦截粘贴操作并删除我不想要的格式?
答案 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;
}
}