Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何比较两个流程文档?_C#_.net_Richtextbox_Flowdocument - Fatal编程技术网

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元素。其实内容很简单。只有前景色,大胆和类似的东西被设置。