ContextNode 类
表示在墨迹分析过程中创建的对象树中的一个节点。
命名空间: System.Windows.Ink
程序集: IAWinFX(在 IAWinFX.dll 中)
语法
声明
Public Class ContextNode
用法
Dim instance As ContextNode
public class ContextNode
public ref class ContextNode
public class ContextNode
public class ContextNode
备注
在 InkAnalyzer 执行墨迹分析后,它以 ContextNode 对象树的形式表示结果。RootNode 位于树的顶部;在树下方的位置越深,所表示的笔画集合就越小。这些节点可以是单词组(例如段落或行)、分析的墨迹(例如单词或绘图)或各种其他类型。(有关完整列表,请参见 ContextNodeType 类。)
可以手动向 InkAnalyzer 添加节点(如 AnalysisHintNode、ImageNode 和 TextWordNode 对象等)。
对于错误的输入,此方法引发 ArgumentException 异常。
示例
此示例获取名为 theInkAnalyzer 的 InkAnalyzer,并使用其 ContextNode 树来填充名为 theTreeView 的 [System.Windows.Controls.TreeView]。当选中树视图中的某个节点时,该节点的关联笔画将设置为以红色显示。[System.Windows.FrameworkElement.Tag] 属性用于在树节点与树节点所表示的上下文节点之间进行映射。
Private Sub BuildTree()
' Remove the old nodes from the TreeView and add the current results.
Me.theResultsTreeView.Items.Clear()
Dim rootNode As New TreeViewItem()
rootNode.Tag = Me.theInkAnalyzer.RootNode
rootNode.Header = theInkAnalyzer.RootNode.ToString()
Me.theResultsTreeView.Items.Add(rootNode)
WalkTree(Me.theInkAnalyzer.RootNode, rootNode)
End Sub 'BuildTree
Private Shared Sub WalkTree(ByVal parentContextNode As ContextNode, ByVal parentTreeNode As TreeViewItem)
parentTreeNode.IsExpanded = True
For Each theContextSubnode As ContextNode In parentContextNode.SubNodes
Dim newTreeNode As New TreeViewItem()
newTreeNode.Header = theContextSubnode.ToString()
If TypeOf theContextSubnode Is InkWordNode Then
newTreeNode.Header += ": " + CType(theContextSubnode, InkWordNode).GetRecognizedString()
ElseIf TypeOf theContextSubnode Is InkDrawingNode Then
newTreeNode.Header += ": " + CType(theContextSubnode, InkDrawingNode).GetShapeName()
End If
' If the context node is confirmed, add a note to the
' tree view item.
If (theContextSubnode.IsConfirmed(ConfirmationType.NodeTypeAndProperties)) Then
newTreeNode.Header += " Confirmed."
End If
' Add the context node as a tag of the tree view item and
' add the new tree view item to the parent node.
newTreeNode.Tag = theContextSubnode
parentTreeNode.Items.Add(newTreeNode)
WalkTree(theContextSubnode, newTreeNode)
Next theContextSubnode
End Sub 'WalkTree
Sub theResultsTreeView_SelectedItemChanged(ByVal sender As Object, _
ByVal e As RoutedPropertyChangedEventArgs(Of Object))
Dim selectedTreeViewItem As TreeViewItem = e.NewValue '
If selectedTreeViewItem Is Nothing Then
Return
End If
' Get the context node
Dim selectedNode As ContextNode = CType(selectedTreeViewItem.Tag, ContextNode)
MarkNodeAsRed(selectedNode)
timeStampLabel.Content = ""
' Show selected results
If Not (selectedNode Is Nothing) Then
If selectedNode.Type = ContextNodeType.WritingRegion Then
Dim writingRegion As WritingRegionNode = CType(selectedNode, WritingRegionNode)
selectedResultsTextBox.Text = writingRegion.GetRecognizedString()
ElseIf selectedNode.Type = ContextNodeType.Paragraph Then
Dim paragraph As ParagraphNode = CType(selectedNode, ParagraphNode)
selectedResultsTextBox.Text = paragraph.GetRecognizedString()
ElseIf selectedNode.Type = ContextNodeType.Line Then
Dim line As LineNode = CType(selectedNode, LineNode)
selectedResultsTextBox.Text = line.GetRecognizedString()
ElseIf selectedNode.Type = ContextNodeType.InkWord Then
Dim inkWord As InkWordNode = CType(selectedNode, InkWordNode)
Dim parentNode As ContextNode = inkWord.ParentNode
If TypeOf parentNode Is LineNode Then
Dim parentLine As LineNode = CType(parentNode, LineNode)
' Put parent line's recognized string into the text box
selectedResultsTextBox.Text = parentLine.GetRecognizedString()
' Select the text that corresponds to the ink word
Dim subNodes As New ContextNodeCollection(theInkAnalyzer)
subNodes.Add(inkWord)
Dim start As Integer
Dim length As Integer
parentLine.GetTextRangeFromNodes(subNodes, start, length)
If start >= 0 AndAlso length > 0 Then
selectedResultsTextBox.Select(start, length)
End If
End If
ElseIf selectedNode.Type = ContextNodeType.InkDrawing Then
Dim drawingNode As InkDrawingNode = CType(selectedNode, InkDrawingNode)
selectedResultsTextBox.Text = drawingNode.GetShapeName()
ElseIf selectedNode.Type = ContextNodeType.InkBullet Then
Dim bulletNode As InkBulletNode = CType(selectedNode, InkBulletNode)
selectedResultsTextBox.Text = bulletNode.GetRecognizedString()
ElseIf selectedNode.Type = ContextNodeType.CustomRecognizer Then
Dim customRecognizer As CustomRecognizerNode = CType(selectedNode, CustomRecognizerNode)
selectedResultsTextBox.Text = customRecognizer.GetRecognizedString()
ElseIf selectedNode.Type = ContextNodeType.Object Then
Dim selectedObject As ObjectNode = CType(selectedNode, ObjectNode)
selectedResultsTextBox.Text = selectedObject.GetRecognizedString()
Else
selectedResultsTextBox.Text = ""
End If
If TypeOf selectedNode Is InkWordNode Then
Dim inkWord As InkWordNode = CType(selectedNode, InkWordNode)
' Show the time stamp
If inkWord.ContainsPropertyData(Me.timeStampGuid) Then
Dim timeStamp As DateTime = CType(inkWord.GetPropertyData(Me.timeStampGuid), DateTime)
timeStampLabel.Content = timeStamp.ToShortTimeString()
End If
' Snippet to demonstrate GetPropertyDataIds
Dim propertyDataIds As Guid() = inkWord.GetPropertyDataIds()
' Snippets to demonstrate loading and saving
Dim data As Byte() = inkWord.SavePropertiesData()
If Not inkWord.LoadPropertiesData(data) Then
MessageBox.Show("Cannot load property data")
End If
End If
End If
PopulateLinksList(selectedNode)
Me.currentNode = selectedNode
End Sub
Private Sub PopulateLinksList(ByVal selectedNode As ContextNode)
linksListBox.Items.Clear()
If selectedNode Is Nothing Then
Return
End If
Dim link As ContextLink
For Each link In selectedNode.Links
linksListBox.Items.Add(link.SourceNode.ToString() + ", " & _
link.DestinationNode.ToString() & ": " & _
link.LinkDirection.ToString())
Next
End Sub
Sub MarkNodeAsRed(ByVal selectedNode As ContextNode)
' Set all node strokes to black, but this one to red
Dim stroke As Stroke
For Each stroke In Me.theInkCanvas.Strokes
If Not (selectedNode Is Nothing) AndAlso selectedNode.Strokes.Contains(stroke) Then
stroke.DrawingAttributes.Color = Colors.Red
Else
stroke.DrawingAttributes.Color = Me.theInkCanvas.DefaultDrawingAttributes.Color
End If
Next stroke
End Sub 'theResultsTreeView_SelectedItemChanged
private void BuildTree()
{
// Remove the old nodes from the TreeView and add the current results.
this.theResultsTreeView.Items.Clear();
TreeViewItem rootNode = new TreeViewItem();
rootNode.Tag = this.theInkAnalyzer.RootNode;
rootNode.Header = theInkAnalyzer.RootNode.ToString();
this.theResultsTreeView.Items.Add(rootNode);
WalkTree(this.theInkAnalyzer.RootNode, rootNode);
}
private static void WalkTree(ContextNode parentContextNode, TreeViewItem parentTreeNode)
{
// Expand the current TreeViewItem.
parentTreeNode.IsExpanded = true;
foreach (ContextNode theContextSubnode
in parentContextNode.SubNodes)
{
TreeViewItem newTreeNode = new TreeViewItem();
newTreeNode.Header = theContextSubnode.ToString();
if (theContextSubnode is InkWordNode)
{
newTreeNode.Header += ": " +
((InkWordNode)theContextSubnode).GetRecognizedString();
}
else if (theContextSubnode is InkDrawingNode)
{
newTreeNode.Header += ": " +
((InkDrawingNode)theContextSubnode).GetShapeName();
}
// If the context node is confirmed, add a note to the
// tree view item.
if (theContextSubnode.IsConfirmed(ConfirmationType.NodeTypeAndProperties))
{
newTreeNode.Header += " Confirmed.";
}
// Add the context node as a tag of the tree view item and
// add the new tree view item to the parent node.
newTreeNode.Tag = theContextSubnode;
parentTreeNode.Items.Add(newTreeNode);
WalkTree(theContextSubnode, newTreeNode);
}
}
void theResultsTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeViewItem selectedTreeViewItem = e.NewValue as TreeViewItem;
if (selectedTreeViewItem == null)
{
return;
}
// Get the context node
ContextNode selectedNode = (ContextNode)selectedTreeViewItem.Tag;
MarkNodeAsRed(selectedNode);
timeStampLabel.Content = "";
// Show selected results
if (selectedNode != null)
{
if (selectedNode.Type == ContextNodeType.WritingRegion)
{
WritingRegionNode writingRegion = (WritingRegionNode)selectedNode;
selectedResultsTextBox.Text = writingRegion.GetRecognizedString();
}
else if (selectedNode.Type == ContextNodeType.Paragraph)
{
ParagraphNode paragraph = (ParagraphNode)selectedNode;
selectedResultsTextBox.Text = paragraph.GetRecognizedString();
}
else if (selectedNode.Type == ContextNodeType.Line)
{
LineNode line = (LineNode)selectedNode;
selectedResultsTextBox.Text = line.GetRecognizedString();
}
else if (selectedNode.Type == ContextNodeType.InkWord)
{
InkWordNode inkWord = (InkWordNode)selectedNode;
ContextNode parentNode = inkWord.ParentNode;
if (parentNode is LineNode)
{
LineNode parentLine = (LineNode)parentNode;
// Put parent line's recognized string into the text box
selectedResultsTextBox.Text = parentLine.GetRecognizedString();
// Select the text that corresponds to the ink word
ContextNodeCollection subNodes = new ContextNodeCollection(theInkAnalyzer);
subNodes.Add(inkWord);
int start;
int length;
parentLine.GetTextRangeFromNodes(subNodes, out start, out length);
if (start >= 0 && length > 0)
{
selectedResultsTextBox.Select(start, length);
}
}
}
else if (selectedNode.Type == ContextNodeType.InkDrawing)
{
InkDrawingNode drawingNode = (InkDrawingNode)selectedNode;
selectedResultsTextBox.Text = drawingNode.GetShapeName();
}
else if (selectedNode.Type == ContextNodeType.InkBullet)
{
InkBulletNode bulletNode = (InkBulletNode)selectedNode;
selectedResultsTextBox.Text = bulletNode.GetRecognizedString();
}
else if (selectedNode.Type == ContextNodeType.CustomRecognizer)
{
CustomRecognizerNode customRecognizer = (CustomRecognizerNode)selectedNode;
selectedResultsTextBox.Text = customRecognizer.GetRecognizedString();
}
else if (selectedNode.Type == ContextNodeType.Object)
{
ObjectNode selectedObject = (ObjectNode)selectedNode;
selectedResultsTextBox.Text = selectedObject.GetRecognizedString();
}
else
{
selectedResultsTextBox.Text = "";
}
if (selectedNode is InkWordNode)
{
InkWordNode inkWord = (InkWordNode)selectedNode;
// Show the time stamp
if (inkWord.ContainsPropertyData(this.timeStampGuid))
{
DateTime timeStamp =
(DateTime)inkWord.GetPropertyData(this.timeStampGuid);
timeStampLabel.Content = timeStamp.ToShortTimeString();
}
// Snippet to demonstrate GetPropertyDataIds
Guid[] propertyDataIds = inkWord.GetPropertyDataIds();
// Snippets to demonstrate loading and saving
byte[] data = inkWord.SavePropertiesData();
if (!inkWord.LoadPropertiesData(data))
MessageBox.Show("Cannot load property data");
}
}
PopulateLinksList(selectedNode);
this.currentNode = selectedNode;
}
private void PopulateLinksList(ContextNode selectedNode)
{
linksListBox.Items.Clear();
if (selectedNode == null)
{
return;
}
foreach (ContextLink link in selectedNode.Links)
{
linksListBox.Items.Add(link.SourceNode.ToString() + ", " +
link.DestinationNode.ToString() + ": " +
link.LinkDirection.ToString());
}
}
private void MarkNodeAsRed(ContextNode selectedNode)
{
// Set all node strokes to black, but this one to red
foreach (Stroke stroke in this.theInkCanvas.Strokes)
{
if (selectedNode != null &&
selectedNode.Strokes.Contains(stroke))
stroke.DrawingAttributes.Color = Colors.Red;
else
stroke.DrawingAttributes.Color =
this.theInkCanvas.DefaultDrawingAttributes.Color;
}
}
继承层次结构
System.Object
System.Windows.Ink.ContextNode
System.Windows.Ink.AnalysisHintNode
System.Windows.Ink.CustomRecognizerNode
System.Windows.Ink.ImageNode
System.Windows.Ink.InkBulletNode
System.Windows.Ink.InkDrawingNode
System.Windows.Ink.InkWordNode
System.Windows.Ink.LineNode
System.Windows.Ink.ObjectNode
System.Windows.Ink.ParagraphNode
System.Windows.Ink.RootNode
System.Windows.Ink.TextWordNode
System.Windows.Ink.UnclassifiedInkNode
System.Windows.Ink.WritingRegionNode
线程安全
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
平台
Windows Vista
.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。
版本信息
.NET Framework
受以下版本支持:3.0