2015-10-07 5 views
0

Я хочу сравнить a FlowDocument с документом Rich Text Box. Вот кодКак сравнить два FlowDocuments?

if (rtbEditor.Document != (XamlReader.Parse(currentNote.content) as FlowDocument)) 
{ 
    MessageBox.Show("Overwrite existing Note?", "Save", MessageBoxButton.OKCancel); 
} 

В начале я установил rtbEditor «s документ как

rtbEditor.Document = XamlReader.Parse(currentNote.content) as FlowDocument; 

Таким образом, если содержание rtbEditor не изменилось, я подумал, что если оператор не должен выполнять, но делает. Наверное, это не способ сравнить FlowDocuments. Если это не так, то как мы можем сравнить два документа?

Если необходимо, currentNote.content представляет собой строку, содержащую содержимое xml FlowDocument.

+0

Это сравнение двух объектов, и это разные объекты. Бьюсь об заклад, если вы создали два XamlReader.Parse (currentNote.content) в качестве FlowDocument, они не будут одинаковыми. – Paparazzi

+0

@ Frisbee Я знаю. Я просто разместил код, потому что это единственный способ, о котором я мог думать. – ozgur

+0

Может ли любой из двух экземпляров «FlowDocument» иметь встроенные растровые изображения? – dbc

ответ

0

Предполагая, что у вас нет изображений в ваших экземплярах 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, вы можете parse your XAML to an XElement и использовать XNode.DeepEquals(). Вы также можете сериализовать 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); 
} 

Если вы обеспокоены тем, что может быть вложены сообщения и хотите сгенерировать предупреждение сообщение в этом случае, см. Finding all Images in a FlowDocument.

Смежные вопросы