C# 如何比较两个流程文档?
我想将C# 如何比较两个流程文档?,c#,.net,richtextbox,flowdocument,C#,.net,Richtextbox,Flowdocument,我想将流程文档与富文本框的文档进行比较。这是密码 if (rtbEditor.Document != (XamlReader.Parse(currentNote.content) as FlowDocument)) { MessageBox.Show("Overwrite existing Note?", "Save", MessageBoxButton.OKCancel); } 开始时,我将rtbEditor的文档设置为 rtbEditor.Document = XamlReader.
流程文档
与富文本框
的文档进行比较。这是密码
if (rtbEditor.Document != (XamlReader.Parse(currentNote.content) as FlowDocument))
{
MessageBox.Show("Overwrite existing Note?", "Save", MessageBoxButton.OKCancel);
}
开始时,我将rtbEditor
的文档设置为
rtbEditor.Document = XamlReader.Parse(currentNote.content) as FlowDocument;
因此,除非更改rtbEditor
的内容,否则我认为if语句不应该执行,但它确实执行了。可能这不是比较流程文档的方法。如果这不是正确的方法,那么我们如何比较两个文档
如果有必要,则currentNote.content
是一个包含FlowDocument
的xml内容的字符串,假设您的FlowDocument
实例中没有图像,您只需序列化为XAML并比较XAML即可。首先,创建扩展方法以生成XAML字符串:
public static class FrameworkContentElementExtensions
{
public static string ToXaml(this FrameworkContentElement element) // For instance, a FlowDocument
{
if (element == null)
return null;
var sb = new StringBuilder();
using (var xmlWriter = XmlWriter.Create(sb))
{
XamlWriter.Save(element, xmlWriter);
}
return sb.ToString();
}
public static string ToFormattedXamlString(this FrameworkContentElement element)
{
if (element == null)
return null;
var settings = new XmlWriterSettings() { Indent = true, IndentChars = " " };
var sb = new StringBuilder();
using (var xmlWriter = XmlWriter.Create(sb, settings))
{
XamlWriter.Save(element, xmlWriter);
}
return sb.ToString();
}
}
那你就可以了
if (rtbEditor.Document.ToXaml() != currentNote.content)
{
MessageBox.Show("Overwrite existing Note?", "Save", MessageBoxButton.OKCancel);
}
请注意,如果XAML仅因外观格式(XML缩进)而不同,因为XAML文档是有效的XML,所以可以使用。您还可以将FrameworkContentElement
直接序列化为XElement
,而无需插入字符串表示以提高性能:
public static class FrameworkContentElementExtensions
{
public static XElement ToXamlXElement(this FrameworkContentElement element) // For instance, a FlowDocument
{
if (element == null)
return null;
var doc = new XDocument();
using (var xmlWriter = doc.CreateWriter())
{
XamlWriter.Save(element, xmlWriter);
}
var xElement = doc.Root;
if (xElement != null)
xElement.Remove();
return xElement;
}
}
然后
var docXaml = rtbEditor.Document.ToXamlXElement();
var currentNoteXaml = XElement.Parse(currentNote.content);
if (!XNode.DeepEquals(docXaml, currentNoteXaml))
{
MessageBox.Show("Overwrite existing Note?", "Save", MessageBoxButton.OKCancel);
}
如果您担心可能存在嵌入的消息,并希望在这种情况下生成警告消息,请参阅。它正在比较两个对象,而这两个对象是不同的对象。我敢打赌,如果你创建了两个XamlReader.Parse(currentNote.content)作为FlowDocument,它们甚至不一样。@Frisbee我知道。我刚刚发布了代码,因为这是我唯一能想到的方法。这两个FlowDocument
实例中有没有嵌入位图?@dbc没有。它们只是与文本相关的xml元素。其实内容很简单。只有前景色,大胆和类似的东西被设置。