ContextNode Class
Assembly: Microsoft.Ink.Analysis (in microsoft.ink.analysis.dll)
After an InkAnalyzer performs an analysis on ink, it presents the results as a tree of ContextNode objects. These nodes start at the top with a RootNode, and then represent smaller and smaller collections of strokes as they progress down the tree. These nodes can be groups of words (such as paragraphs or lines), analyzed ink (such as words or drawings), or a variety of other types. (See the ContextNodeType class for a full list.)
Other nodes, such as AnalysisHintNode, TextWordNode, ImageNode could be added to InkAnalyzer by you.
This example takes an InkAnalyzer, theInkAnalyzer, and uses its ContextNode tree to fill a System.Windows.Forms.TreeViewSystem.Windows.Forms.TreeView, theTreeView. When a node in the tree view is selected, those strokes are set to appear in red. The Tag property is used to map between tree nodes and the context nodes that they represent.
Private Sub BuildTree() Me.theTreeView.Nodes.Clear() Dim rootNode As New TreeNode(Me.theInkAnalyzer.RootNode.ToString()) Me.theTreeView.Nodes.Add(rootNode) rootNode.Tag = Me.theInkAnalyzer.RootNode WalkTree(Me.theInkAnalyzer.RootNode, rootNode) End Sub 'BuildTree Private Sub WalkTree(ByVal parentContextNode As Microsoft.Ink.ContextNode, _ ByVal parentTreeNode As TreeNode) Dim cNode As ContextNode For Each cNode In parentContextNode.SubNodes Dim newTNode As New TreeNode(cNode.ToString()) If TypeOf cNode Is Microsoft.Ink.InkWordNode Then newTNode.Text = newTNode.Text + _ ": " + CType(cNode, InkWordNode).GetRecognizedString() ElseIf TypeOf cNode Is Microsoft.Ink.InkDrawingNode Then Dim shapeName As String = CType(cNode, InkDrawingNode).GetShapeName() If shapeName <> "" Then newTNode.Text = newTNode.Text + ": " + shapeName End If End If WalkTree(cNode, newTNode) parentTreeNode.Nodes.Add(newTNode) ' Add the context node as a tag of the tree node newTNode.Tag = cNode Next cNode End Sub 'WalkTree Private Sub theTreeView_AfterSelect(ByVal sender As Object, _ ByVal e As System.Windows.Forms.TreeViewEventArgs) _ Handles theTreeView.AfterSelect ' Get the context node Dim selectedNode As ContextNode = CType(e.Node.Tag, ContextNode) MarkNodeAsRed(selectedNode) timeStampLabel.Text = "" ' Show selected results If Not (selectedNode Is Nothing) Then Select Case selectedNode.Type Case Microsoft.Ink.ContextNodeType.WritingRegion Dim writingRegion As WritingRegionNode = _ CType(selectedNode, WritingRegionNode) selectedResultsTextBox.Text = writingRegion.GetRecognizedString() Case Microsoft.Ink.ContextNodeType.Paragraph Dim paragraph As ParagraphNode = _ CType(selectedNode, ParagraphNode) selectedResultsTextBox.Text = paragraph.GetRecognizedString() Case Microsoft.Ink.ContextNodeType.Line Dim line As LineNode = _ CType(selectedNode, LineNode) selectedResultsTextBox.Text = line.GetRecognizedString() Case Microsoft.Ink.ContextNodeType.InkWord 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 ' Show the time stamp If inkWord.ContainsPropertyData(Me.timeStampGuid) Then Dim timeStamp As DateTime = _ CType(inkWord.GetPropertyData(Me.timeStampGuid), DateTime) timeStampLabel.Text = 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 Case Microsoft.Ink.ContextNodeType.InkDrawing Dim drawingNode As InkDrawingNode = CType(selectedNode, InkDrawingNode) selectedResultsTextBox.Text = drawingNode.GetShapeName() Case Microsoft.Ink.ContextNodeType.InkBullet Dim bulletNode As InkBulletNode = CType(selectedNode, InkBulletNode) selectedResultsTextBox.Text = bulletNode.GetRecognizedString() Case Microsoft.Ink.ContextNodeType.Object Dim selectedObject As ObjectNode = selectedNode selectedResultsTextBox.Text = selectedObject.GetRecognizedString() Case Microsoft.Ink.ContextNodeType.CustomRecognizer Dim customRecognizer As CustomRecognizerNode = selectedNode selectedResultsTextBox.Text = customRecognizer.GetRecognizedString() Case Else selectedResultsTextBox.Text = "" End Select End If Me.currentNode = selectedNode End Sub 'theTreeView_AfterSelect Private Sub MarkNodeAsRed(ByVal selectedNode As ContextNode) ' Set all node strokes to black, but this one to red Dim inkStroke As Stroke For Each inkStroke In Me.theInkCollector.Ink.Strokes If Not (selectedNode Is Nothing) AndAlso _ selectedNode.Strokes.Contains(inkStroke) Then inkStroke.DrawingAttributes = New DrawingAttributes(Color.Red) Else inkStroke.DrawingAttributes = Me.theInkCollector.DefaultDrawingAttributes End If Next inkStroke theNotesPanel.Refresh() End Sub 'MarkNodeAsRed
Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.