本文整理汇总了C#中System.Windows.Documents.TextElement.AfterLogicalTreeChange方法的典型用法代码示例。如果您正苦于以下问题:C# TextElement.AfterLogicalTreeChange方法的具体用法?C# TextElement.AfterLogicalTreeChange怎么用?C# TextElement.AfterLogicalTreeChange使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Windows.Documents.TextElement
的用法示例。
在下文中一共展示了TextElement.AfterLogicalTreeChange方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: InsertElementInternal
//.........这里部分代码省略.........
if (formerFirstIMEVisibleNode != null)
{
// The following node was the former first ime visible sibling.
// It just moved, and gains an edge character.
formerFirstIMEVisibleNodeCharDelta = formerFirstIMEVisibleNode.IMELeftEdgeCharCount;
formerFirstIMEVisibleNode.IMECharCount += formerFirstIMEVisibleNodeCharDelta;
}
}
// Ancester nodes gain the two edge symbols.
UpdateContainerSymbolCount(elementNode.GetContainingNode(), /* symbolCount */ elementText == null ? 2 : elementText.Length, deltaCharCount + formerFirstIMEVisibleNodeCharDelta + newFirstIMEVisibleNodeCharDelta);
symbolOffset = elementNode.GetSymbolOffset(this.Generation);
if (newElementNode)
{
// Insert text to account for the element edges.
TextTreeText.InsertElementEdges(_rootNode.RootTextBlock, symbolOffset, childSymbolCount);
}
else
{
// element already has an existing child, just copy over the corresponding text.
TextTreeText.InsertText(_rootNode.RootTextBlock, symbolOffset, elementText);
}
NextGeneration(false /* deletedContent */);
// Handle undo.
TextTreeUndo.CreateInsertElementUndoUnit(this, symbolOffset, elementText != null /* deep */);
// If we extracted the TextElement from another tree, raise that event now.
// We can't raise this event any earlier, because prior to now _this_ tree
// is in an invalid state and this tree could be referenced by a listener
// to changes on the other tree.
if (extractChangeEventArgs != null)
{
// Announce the extract from the old tree.
// NB: we already Removed the element from the original logical tree with LogicalTreeHelper,
// and did a BeginChange above.
extractChangeEventArgs.AddChange();
extractChangeEventArgs.TextContainer.EndChange();
}
// Raise the public event for the insert into this tree.
// During document load we won't have listeners and we can save
// an allocation on every insert. This can easily save 1000's of allocations during boot.
if (this.HasListeners)
{
//
startEdgePosition = new TextPointer(this, elementNode, ElementEdge.BeforeStart);
if (childSymbolCount == 0 || elementText != null)
{
AddChange(startEdgePosition, elementText == null ? 2 : elementText.Length, deltaCharCount, PrecursorTextChangeType.ContentAdded);
}
else
{
endEdgePosition = new TextPointer(this, elementNode, ElementEdge.BeforeEnd);
AddChange(startEdgePosition, endEdgePosition, elementNode.SymbolCount,
elementNode.IMELeftEdgeCharCount, elementNode.IMECharCount - elementNode.IMELeftEdgeCharCount,
PrecursorTextChangeType.ElementAdded, null, false);
}
if (formerFirstIMEVisibleNodeCharDelta != 0)
{
RaiseEventForFormerFirstIMEVisibleNode(formerFirstIMEVisibleNode);
}
if (newFirstIMEVisibleNodeCharDelta != 0)
{
RaiseEventForNewFirstIMEVisibleNode(newFirstIMEVisibleNode);
}
}
// Insert the element into a Framework logical tree
element.BeforeLogicalTreeChange();
try
{
LogicalTreeHelper.AddLogicalChild(parentLogicalNode, element);
}
finally
{
element.AfterLogicalTreeChange();
}
// Reparent all children.
// We only need to do this if we created a new element node.
if (newElementNode)
{
ReparentLogicalChildren(elementNode, elementNode.TextElement, parentLogicalNode /* oldParent */);
}
// Notify the TextElement of a content change if it was moved to parent new content. This
// can happen when Runs get merged.
if (scopesExistingContent)
{
element.OnTextUpdated();
}
}
示例2: ExtractElementInternal
// ExtractElement worker. Removes a TextElement from the tree.
//
// If deep is true, also removes any content covered by the element.
// In this case element.TextTreeElementNode will be replaced with a
// deep copy of all contained nodes. Since this is a copy, it can
// be safely inserted into a new tree -- no positions reference it.
//
// deep is true when this method is called during a cross-tree insert
// (that is, when a TextElement is extracted from one tree and inserted
// into another via a call to InsertElement).
//
// If deep is true, returns the raw text corresponding to element and
// its contained content. Otherwise returns null.
//
// If deep is true, extractChangeEventArgs will be non-null on exit,
// containing all the information needed to raise a matching TextChanged
// event. Otherwise, extractChangeEventArgs will be null on exit.
private char[] ExtractElementInternal(TextElement element, bool deep, out ExtractChangeEventArgs extractChangeEventArgs)
{
TextTreeTextElementNode elementNode;
SplayTreeNode containingNode;
TextPointer startPosition;
TextPointer endPosition;
bool empty;
int symbolOffset;
char[] elementText;
TextTreeUndoUnit undoUnit;
SplayTreeNode firstContainedChildNode;
SplayTreeNode lastContainedChildNode;
DependencyObject oldLogicalParent;
BeforeAddChange();
firstContainedChildNode = null;
lastContainedChildNode = null;
extractChangeEventArgs = null;
elementText = null;
elementNode = element.TextElementNode;
containingNode = elementNode.GetContainingNode();
empty = (elementNode.ContainedNode == null);
startPosition = new TextPointer(this, elementNode, ElementEdge.BeforeStart, LogicalDirection.Backward);
// We only need the end position if this element originally spanned any content.
endPosition = null;
if (!empty)
{
endPosition = new TextPointer(this, elementNode, ElementEdge.AfterEnd, LogicalDirection.Backward);
}
symbolOffset = elementNode.GetSymbolOffset(this.Generation);
// Remember the old parent
oldLogicalParent = ((TextTreeNode)containingNode).GetLogicalTreeNode();
// Invalidate any TextElementCollection that depends on the parent.
// Make sure we do that before raising any public events.
TextElementCollectionHelper.MarkDirty(oldLogicalParent);
// Remove the element from the logical tree.
// NB: we do this even for a deep extract, because we can't wait --
// during a deep extract/move to new tree, the property system must be
// notified before the element moves into its new tree.
element.BeforeLogicalTreeChange();
try
{
LogicalTreeHelper.RemoveLogicalChild(oldLogicalParent, element);
}
finally
{
element.AfterLogicalTreeChange();
}
// Handle undo.
if (deep && !empty)
{
undoUnit = TextTreeUndo.CreateDeleteContentUndoUnit(this, startPosition, endPosition);
}
else
{
undoUnit = TextTreeUndo.CreateExtractElementUndoUnit(this, elementNode);
}
// Save the first/last contained node now -- after the ExtractElementFromSiblingTree
// call it will be too late to find them.
if (!deep && !empty)
{
firstContainedChildNode = elementNode.GetFirstContainedNode();
lastContainedChildNode = elementNode.GetLastContainedNode();
}
// Record all the IME related char state before the extract.
int imeCharCount = elementNode.IMECharCount;
int imeLeftEdgeCharCount = elementNode.IMELeftEdgeCharCount;
TextTreeTextElementNode nextNode = (empty && element.IsFirstIMEVisibleSibling) ? (TextTreeTextElementNode)elementNode.GetNextNode() : null;
int nextNodeCharDelta = 0;
if (nextNode != null)
{
//.........这里部分代码省略.........