/// <summary> /// <see cref="System.Windows.Documents.TextRange.EndChange"/> /// </summary> internal static void EndChange(ITextRange thisRange, bool disableScroll, bool skipEvents) { ChangeBlockUndoRecord changeBlockUndoRecord; bool isChanged; ITextContainer textContainer; Invariant.Assert(thisRange._ChangeBlockLevel > 0, "Unmatched EndChange call!"); textContainer = thisRange.Start.TextContainer; try { // // Complete the content changed block. // try { // Raise first public event -- TextContainer.EndChange. textContainer.EndChange(skipEvents); } finally { // Always drop the ChangeBlockLevel, no matter what happens. // This ensures that we won't ignore future events if the // application recovers from an exception. thisRange._ChangeBlockLevel--; // Clear out thisRange.IsChanged now so that it isn't // left dangling if TextContainer.EndChange throws // an exception. isChanged = thisRange._IsChanged; if (thisRange._ChangeBlockLevel == 0) { thisRange._IsChanged = false; } } // // Complete the range repositioned block. // if (thisRange._ChangeBlockLevel == 0 && isChanged) { // Raise the second public event -- TextRange.Changed. thisRange.NotifyChanged(disableScroll, skipEvents); } } finally { // Make sure we close the undo record no matter what happened. changeBlockUndoRecord = (ChangeBlockUndoRecord)thisRange._ChangeBlockUndoRecord; if (changeBlockUndoRecord != null && thisRange._ChangeBlockLevel == 0) { try { changeBlockUndoRecord.OnEndChange(); } finally { thisRange._ChangeBlockUndoRecord = null; } } } }