本文整理汇总了C#中ITextPointer.GetAdjacentElement方法的典型用法代码示例。如果您正苦于以下问题:C# ITextPointer.GetAdjacentElement方法的具体用法?C# ITextPointer.GetAdjacentElement怎么用?C# ITextPointer.GetAdjacentElement使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ITextPointer
的用法示例。
在下文中一共展示了ITextPointer.GetAdjacentElement方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: IsHyperlinkInvalid
/// <summary>
/// Return true if Hyperlink range is invalid.
/// Hyperlink is invalid if it include a UiElement except Image or the range end position
/// is stated before the end position of hyperlink.
/// This must be called before Hyperlink start element position.
/// </summary>
private static bool IsHyperlinkInvalid(ITextPointer textReader, ITextPointer rangeEnd)
{
// TextRead must be on the position before the element start position of Hyperlink
Invariant.Assert(textReader.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementStart);
Invariant.Assert(typeof(Hyperlink).IsAssignableFrom(textReader.GetElementType(LogicalDirection.Forward)));
bool hyperlinkInvalid = false;
// Get the forward adjacent element and cast Hyperlink hardly since it must be Hyperlink
Hyperlink hyperlink = (Hyperlink)textReader.GetAdjacentElement(LogicalDirection.Forward);
ITextPointer hyperlinkNavigation = textReader.CreatePointer();
ITextPointer hyperlinkEnd = textReader.CreatePointer();
hyperlinkEnd.MoveToNextContextPosition(LogicalDirection.Forward);
// Find the hyperlink end position
hyperlinkEnd.MoveToElementEdge(ElementEdge.AfterEnd);
// Hyperlink end position is stated after the range end position.
if (hyperlinkEnd.CompareTo(rangeEnd) > 0)
{
hyperlinkInvalid = true;
}
else
{
// Check whether the hyperlink having a UiElement except Image until hyperlink end position
while (hyperlinkNavigation.CompareTo(hyperlinkEnd) < 0)
{
InlineUIContainer inlineUIContainer = hyperlinkNavigation.GetAdjacentElement(LogicalDirection.Forward) as InlineUIContainer;
if (inlineUIContainer != null && !(inlineUIContainer.Child is Image))
{
hyperlinkInvalid = true;
break;
}
hyperlinkNavigation.MoveToNextContextPosition(LogicalDirection.Forward);
}
}
return hyperlinkInvalid;
}
示例2: WriteStartXamlElement
/// <summary>
/// Writes an opening tag of an element together with all attributes
/// representing Avalon properties.
/// </summary>
/// <param name="range">
/// Parameter used for top-level Table element - to decide what columns to output.
/// For all other elements it's ignored.
/// </param>
/// <param name="textReader">
/// TextPointer positioned in the scope of element whose
/// start tag is going to be written.
/// </param>
/// <param name="xmlWriter">
/// XmlWriter to output element opening tag.
/// </param>
/// <param name="xamlTypeMapper"></param>
/// <param name="reduceElement">
/// True value of this parameter indicates that
/// serialization goes into XamlPackage, so all elements
/// can be preserved as is; otherwise some of them must be
/// reduced into simpler representations (such as InlineUIContainer -> Run
/// and BlockUIContainer -> Paragraph).
/// </param>
/// <param name="preserveTextElements">
/// If TRUE, TextElements are serialized as-is. If FALSE, they're upcast
/// to their base types.
/// </param>
private static void WriteStartXamlElement(ITextRange range, ITextPointer textReader, XmlWriter xmlWriter, XamlTypeMapper xamlTypeMapper, bool reduceElement, bool preserveTextElements)
{
Type elementType = textReader.ParentType;
Type elementTypeStandardized = TextSchema.GetStandardElementType(elementType, reduceElement);
// Get rid f UIContainers when their child is not an image
if (elementTypeStandardized == typeof(InlineUIContainer) || elementTypeStandardized == typeof(BlockUIContainer))
{
Invariant.Assert(!reduceElement);
InlineUIContainer inlineUIContainer = textReader.GetAdjacentElement(LogicalDirection.Backward) as InlineUIContainer;
BlockUIContainer blockUIContainer = textReader.GetAdjacentElement(LogicalDirection.Backward) as BlockUIContainer;
if ((inlineUIContainer == null || !(inlineUIContainer.Child is Image)) &&
(blockUIContainer == null || !(blockUIContainer.Child is Image)))
{
// Even when we serialize for DataFormats.XamlPackage we strip out UIElement
// different from Images.
// Note that this condition is consistent with the one in WriteEmbeddedObject -
// so that when we reduce the element type fromm UIContainer to Run/Paragraph
// we also output just a space instead of the embedded object conntained in it.
elementTypeStandardized = TextSchema.GetStandardElementType(elementType, /*reduceElement:*/true);
}
}
else if (preserveTextElements)
{
elementTypeStandardized = elementType;
}
bool customTextElement = preserveTextElements && !TextSchema.IsKnownType(elementType);
if (customTextElement)
{
// If the element is not from PresentationFramework, we'll need to serialize a namespace
//
int index = elementTypeStandardized.Module.Name.LastIndexOf('.');
string assembly = (index == -1 ? elementTypeStandardized.Module.Name : elementTypeStandardized.Module.Name.Substring(0, index));
string nameSpace = "clr-namespace:" + elementTypeStandardized.Namespace + ";" + "assembly=" + assembly;
string prefix = elementTypeStandardized.Namespace;
xmlWriter.WriteStartElement(prefix, elementTypeStandardized.Name, nameSpace);
}
else
{
xmlWriter.WriteStartElement(elementTypeStandardized.Name);
}
// Write properties
DependencyObject complexProperties = new DependencyObject();
WriteInheritableProperties(elementTypeStandardized, textReader, xmlWriter, /*onlyAffected:*/true, complexProperties);
WriteNoninheritableProperties(elementTypeStandardized, textReader, xmlWriter, /*onlyAffected:*/true, complexProperties);
if (customTextElement)
{
WriteLocallySetProperties(elementTypeStandardized, textReader, xmlWriter, complexProperties);
}
WriteComplexProperties(xmlWriter, complexProperties, elementTypeStandardized);
// Special case for Table element serialization
if (elementTypeStandardized == typeof(Table) && textReader is TextPointer)
{
// Write the columns text.
WriteTableColumnsInformation(range, (Table)((TextPointer)textReader).Parent, xmlWriter, xamlTypeMapper);
}
}
示例3: WalkRegionBoundary
// GetText handler for Blocks and TableCell to add '\n' or TS_CHAR_REGION.
private static bool WalkRegionBoundary(ITextPointer navigator, ITextPointer limit, char[] text, int cchReq, ref int charsCopied, UnsafeNativeMethods.TS_RUNINFO[] runInfo, int cRunInfoReq, ref int cRunInfoRcv)
{
bool hitLimit;
Invariant.Assert(navigator.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementStart || navigator.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementEnd);
Invariant.Assert(limit == null || navigator.CompareTo(limit) <= 0);
// If the caller passed in a non-null limit, we don't do anything and just return true.
// we've passed it.
if (limit != null)
{
if (navigator.CompareTo(limit) >= 0)
{
return true;
}
}
hitLimit = false;
if (cchReq > 0)
{
// Add one TS_CHAR_REGION (TableCell) or '\n' (everything else) char.
char ch = (navigator.GetAdjacentElement(LogicalDirection.Forward) is TableCell) ? UnsafeNativeMethods.TS_CHAR_REGION : '\n';
text[charsCopied] = ch;
navigator.MoveByOffset(1);
charsCopied += 1;
hitLimit = (text.Length == charsCopied) || (limit != null && navigator.CompareTo(limit) == 0);
}
else
{
// Caller doesn't want text, just run info.
// Advance the navigator.
// Add one TS_CHAR_REGION char.
navigator.MoveByOffset(1);
}
if (cRunInfoReq > 0)
{
// Be sure to merge this text run with the previous run, if they are both text runs.
// (A good robustness fix would be to make cicero handle this, if we ever get the chance.)
if (cRunInfoRcv > 0 && runInfo[cRunInfoRcv - 1].type == UnsafeNativeMethods.TsRunType.TS_RT_PLAIN)
{
runInfo[cRunInfoRcv - 1].count += 1;
}
else
{
runInfo[cRunInfoRcv].count = 1;
runInfo[cRunInfoRcv].type = UnsafeNativeMethods.TsRunType.TS_RT_PLAIN;
cRunInfoRcv++;
}
}
return hitLimit;
}
示例4: GetNormalizedRange
// Normalizes a range:
//
// -The start position is advanced over all element edges not visible
// to the IMEs.
// -Start and end positions are moved to insertion positions.
private void GetNormalizedRange(int startCharOffset, int endCharOffset, out ITextPointer start, out ITextPointer end)
{
start = CreatePointerAtCharOffset(startCharOffset, LogicalDirection.Forward);
end = (startCharOffset == endCharOffset) ? start : CreatePointerAtCharOffset(endCharOffset, LogicalDirection.Backward);
// Skip over hidden element edges.
while (start.CompareTo(end) < 0)
{
TextPointerContext forwardContext = start.GetPointerContext(LogicalDirection.Forward);
if (forwardContext == TextPointerContext.ElementStart)
{
TextElement element = start.GetAdjacentElement(LogicalDirection.Forward) as TextElement;
if (element == null)
break;
if (element.IMELeftEdgeCharCount != 0)
break;
}
else if (forwardContext != TextPointerContext.ElementEnd)
{
break;
}
start.MoveToNextContextPosition(LogicalDirection.Forward);
}
// Move to insertion positions.
// If the positions are already adjacent to text, we must respect
// the IME's decision in regards to exact placement.
// MoveToInsertionPosition will skip over surrogates and combining
// marks, but the IME needs fine-grained control over these positions.
if (start.CompareTo(end) == 0)
{
start = start.GetFormatNormalizedPosition(LogicalDirection.Backward);
end = start;
}
else
{
start = start.GetFormatNormalizedPosition(LogicalDirection.Backward);
end = end.GetFormatNormalizedPosition(LogicalDirection.Backward);
}
}
示例5: GetContentPosition
// Returns a position ajacent to the supplied position, skipping any
// intermediate Inlines.
// This is useful for sliding inside the context of adjacent Hyperlinks,
// Spans, etc.
private static ITextPointer GetContentPosition(ITextPointer position)
{
while (position.GetAdjacentElement(LogicalDirection.Forward) is Inline)
{
position = position.GetNextContextPosition(LogicalDirection.Forward);
}
return position;
}
示例6: PlainConvertAccessKey
// Part of plain text converter: called from GetTextInternal when processing ElementStart for AccessKey elements
// Uses s stack of list items indices and updates it for following list items.
private static void PlainConvertAccessKey(StringBuilder textBuffer, ITextPointer navigator)
{
// Creating an "_" prefix for AccessKey character (represented as a Run with special serialization attribution)
object element = navigator.GetAdjacentElement(LogicalDirection.Forward);
if (AccessText.HasCustomSerialization(element))
{
textBuffer.Append(AccessText.AccessKeyMarker);
}
}
示例7: PlainConvertListItemStart
// Part of plain text converter: called from GetTextInternal when processing ElementStart for ListItem elements
// Uses s stack of list items indices and updates it for following list items.
private static void PlainConvertListItemStart(StringBuilder textBuffer, ITextPointer navigator, ref Stack<int> listItemCounter)
{
if (navigator is TextPointer) // can do somethinng useful only in concrete TextContainer - not in an abstract one
{
List list = (List)((TextPointer)navigator).Parent;
ListItem listItem = (ListItem)navigator.GetAdjacentElement(LogicalDirection.Forward);
// Initialize list context
if (listItemCounter == null)
{
listItemCounter = new Stack<int>(1);
}
if (listItemCounter.Count == 0)
{
// List is taken from its middle position. Need to identify starting item number
listItemCounter.Push(((IList)listItem.SiblingListItems).IndexOf(listItem));
}
// Get list item number
Invariant.Assert(listItemCounter.Count > 0, "expectinng listItemCounter.Count > 0");
int listItemIndex = listItemCounter.Pop();
int indexBase = list != null ? list.StartIndex : 0;
TextMarkerStyle markerStyle = list != null ? list.MarkerStyle : TextMarkerStyle.Disc;
WriteListMarker(textBuffer, markerStyle, listItemIndex + indexBase);
// Advance
listItemIndex++;
listItemCounter.Push(listItemIndex);
}
}
示例8: PlainConvertListStart
// Part of plain text converter: called from GetTextInternal when processing ElementStart for List elements.
// Initializes a stack of list item counters and pushes a new zero for the opened list level.
private static void PlainConvertListStart(ITextPointer navigator, ref Stack<int> listItemCounter)
{
List list = (List)navigator.GetAdjacentElement(LogicalDirection.Forward);
// Initialize list context
if (listItemCounter == null)
{
listItemCounter = new Stack<int>(1);
}
listItemCounter.Push(0);
}
示例9: GetAutomationPeersFromRange
//-------------------------------------------------------------------
//
// Internal Methods
//
//-------------------------------------------------------------------
#region Internal Methods
/// <summary>
/// Retrieves a collection of AutomationPeers that fall within the range.
/// Children that overlap with the range but are not entirely enclosed by
/// it will also be included in the collection.
/// </summary>
internal static List<AutomationPeer> GetAutomationPeersFromRange(ITextPointer start, ITextPointer end, ITextPointer ownerContentStart)
{
bool positionMoved;
AutomationPeer peer = null;
object element;
List<AutomationPeer> peers = new List<AutomationPeer>();
start = start.CreatePointer();
while (start.CompareTo(end) < 0)
{
// Indicate that 'start' position is not moved yet.
positionMoved = false;
if (start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementStart)
{
// Get adjacent element and try to retrive AutomationPeer for it.
element = start.GetAdjacentElement(LogicalDirection.Forward);
if (element is ContentElement)
{
peer = ContentElementAutomationPeer.CreatePeerForElement((ContentElement)element);
// If AutomationPeer has been retrieved, add it to the collection.
// And skip entire element.
if (peer != null)
{
if (ownerContentStart == null || IsImmediateAutomationChild(start, ownerContentStart))
{
peers.Add(peer);
}
start.MoveToNextContextPosition(LogicalDirection.Forward);
start.MoveToElementEdge(ElementEdge.AfterEnd);
positionMoved = true;
}
}
}
else if (start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.EmbeddedElement)
{
// Get adjacent element and try to retrive AutomationPeer for it.
element = start.GetAdjacentElement(LogicalDirection.Forward);
if (element is UIElement)
{
if (ownerContentStart == null || IsImmediateAutomationChild(start, ownerContentStart))
{
peer = UIElementAutomationPeer.CreatePeerForElement((UIElement)element);
// If AutomationPeer has been retrieved, add it to the collection.
if (peer != null)
{
peers.Add(peer);
}
else
{
iterate((Visual)element, peers);
}
}
}
else if (element is ContentElement)
{
peer = ContentElementAutomationPeer.CreatePeerForElement((ContentElement)element);
// If AutomationPeer has been retrieved, add it to the collection.
if (peer != null)
{
if (ownerContentStart == null || IsImmediateAutomationChild(start, ownerContentStart))
{
peers.Add(peer);
}
}
}
}
// Move to the next content position, if position has not been moved already.
if (!positionMoved)
{
if (!start.MoveToNextContextPosition(LogicalDirection.Forward))
{
break;
}
}
}
return peers;
}