private void UIThreadSynch_SynchContent(SynchContentEventArgs e)
        {
            if (e.Type == SynchContentEventType.RequestCopyCurrentPage)
              {
            //Sends the highlights, scribbles and notes in the current page
            SendAll(ActualPage);
              }
              else if (e.Type == SynchContentEventType.RequestCopyAll)
              {
            for (int pageIndex = 0; pageIndex < ActualDocument.Pages.Length; pageIndex++)
              SendAll(pageIndex);
              }
              else if (e.Type == SynchContentEventType.Highlight)
              {
            if (e.DocumentID != ActualDocument.ID)
              return;
            if (e.PageIndex < 0 || e.PageIndex >= ActualDocument.Pages.Length)
              return;

            Highlight highlight = e.Content as Highlight;
            var exists = ActualDocument[e.PageIndex].Highlights.FirstOrDefault(tmp => tmp.ID == highlight.ID);
            if (exists != null)
              return;

            ActualDocument[e.PageIndex].Highlights.Add(highlight);
            if (e.PageIndex == ActualPage)
              AddHighlight(highlight.Line, cHighlights);
            PushToUndoStack(ActiveReadingTool.Highlighter, highlight);
              }
              else if (e.Type == SynchContentEventType.Stroke)
              {
            if (e.DocumentID != ActualDocument.ID)
              return;
            if (e.PageIndex < 0 || e.PageIndex >= ActualDocument.Pages.Length)
              return;

            Stroke stroke = e.Content as Stroke;
            Guid collectionID = new Guid((String)stroke.GetPropertyData(strokeCollectionPropertyID));
            ScribbleCollection collection = (ScribbleCollection)ActualDocument[e.PageIndex].ScribblingCollections.FirstOrDefault(tmp => tmp.ID == collectionID);
            if (collection == null)
            {
              collection = new ScribbleCollection() { ID = collectionID, Scribbles = new StrokeCollection() };
              ActualDocument[e.PageIndex].ScribblingCollections.Add(collection);
            }

            Guid strokeID = Guid.Parse(stroke.GetPropertyData(strokeObjectPropertyID) as String);
            var strokeExist = collection.Scribbles.FirstOrDefault(tmp => Guid.Parse(tmp.GetPropertyData(strokeObjectPropertyID) as String) == strokeID);
            if (strokeExist != null)
              return;

            collection.Scribbles.Add(stroke);
            if (e.PageIndex == ActualPage)
              inkCScribble.Strokes.Add(stroke);
            PushToUndoStack(ActiveReadingTool.Pen, collection, stroke);
              }
              else if (e.Type == SynchContentEventType.Note)
              {
            if (e.DocumentID != ActualDocument.ID)
              return;
            if (e.PageIndex < 0 || e.PageIndex >= ActualDocument.Pages.Length)
              return;

            Note note = e.Content as Note;
            var exists = ActualDocument[e.PageIndex].Annotations.FirstOrDefault(tmp => tmp.ID == note.ID);
            if (exists != null)
              return;

            if (e.PageIndex == ActualPage)
              AddNote(note);
            ActualDocument[e.PageIndex].Annotations.Add(note);
              }
        }
 void Synch_SynchContent(object sender, SynchContentEventArgs e)
 {
     Dispatcher.Invoke(DispatcherPriority.Background,
     (Action)delegate()
     {
       UIThreadSynch_SynchContent(e);
     });
 }