RootNode 类

表示用于描述墨迹分析结果的节点树的顶 ContextNode

命名空间:  Microsoft.Ink
程序集:  Microsoft.Ink.Analysis(在 Microsoft.Ink.Analysis.dll 中)

语法

声明
Public NotInheritable Class RootNode _
    Inherits ContextNode
用法
Dim instance As RootNode
public sealed class RootNode : ContextNode
public ref class RootNode sealed : public ContextNode
public final class RootNode extends ContextNode
public final class RootNode extends ContextNode

备注

RootNode 是通过 InkAnalyzer.RootNode 属性进行访问的。

RootNode 对象可包含下列类型的子元素:

示例

下面的示例采用 InkAnalyzer (theInkAnalyzer),并使用其 ContextNode 树从 RootNode 开始填充 TreeView (theTreeView)。这些笔画设置为在选中树视图中的节点时以红色显示。Tag 属性用于在树节点和它们所表示的上下文节点之间进行映射。

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 = String.Empty
        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

        private void BuildTree()
        {
            this.theTreeView.Nodes.Clear();
            TreeNode rootNode =
                new TreeNode(this.theInkAnalyzer.RootNode.ToString());
            this.theTreeView.Nodes.Add(rootNode);
            rootNode.Tag = this.theInkAnalyzer.RootNode;

            WalkTree(this.theInkAnalyzer.RootNode, rootNode);
        }

        private void WalkTree(ContextNode parentContextNode, TreeNode parentTreeNode)
        {
            foreach (ContextNode cNode in parentContextNode.SubNodes)
            {
                TreeNode newTNode = new TreeNode(cNode.ToString());
                if (cNode is Microsoft.Ink.InkWordNode)
                {
                    newTNode.Text +=
                        ": " + ((InkWordNode)cNode).GetRecognizedString();
                }
                else if (cNode is Microsoft.Ink.InkDrawingNode)
                {
                    String shapeName = ((InkDrawingNode)cNode).GetShapeName();
                    if (shapeName != "")
                        newTNode.Text += ": " + shapeName;
                }
                WalkTree(cNode, newTNode);
                parentTreeNode.Nodes.Add(newTNode);

                // Add the context node as a tag of the tree node
                newTNode.Tag = cNode;
            }
        }

        private void theTreeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            // Get the context node
            ContextNode selectedNode = (ContextNode)e.Node.Tag;

            MarkNodeAsRed(selectedNode);

            timeStampLabel.Text = "";

            // Show selected results
            if (selectedNode != null)
            {
                if (selectedNode.Type == Microsoft.Ink.ContextNodeType.WritingRegion)
                {
                    WritingRegionNode writingRegion = (WritingRegionNode)selectedNode;
                    selectedResultsTextBox.Text = writingRegion.GetRecognizedString();
                }
                else if (selectedNode.Type == Microsoft.Ink.ContextNodeType.Paragraph)
                {
                    ParagraphNode paragraph = (ParagraphNode)selectedNode;
                    selectedResultsTextBox.Text = paragraph.GetRecognizedString();
                }
                else if (selectedNode.Type == Microsoft.Ink.ContextNodeType.Line)
                {
                    LineNode line = (LineNode)selectedNode;
                    selectedResultsTextBox.Text = line.GetRecognizedString();
                }
                else if (selectedNode.Type == Microsoft.Ink.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 = 0;
                        int length = 0;
                        parentLine.GetTextRangeFromNodes(subNodes, out start, out length);
                        if (start >= 0 && length > 0)
                        {
                            selectedResultsTextBox.Select(start, length);
                        }
                    }
                }
                else if (selectedNode.Type == Microsoft.Ink.ContextNodeType.InkDrawing)
                {
                    InkDrawingNode drawingNode = (InkDrawingNode)selectedNode;
                    selectedResultsTextBox.Text = drawingNode.GetShapeName();
                }
                else if (selectedNode.Type == Microsoft.Ink.ContextNodeType.InkBullet)
                {
                    InkBulletNode bulletNode = (InkBulletNode)selectedNode;
                    selectedResultsTextBox.Text = bulletNode.GetRecognizedString();
                }
                else if (selectedNode.Type == Microsoft.Ink.ContextNodeType.CustomRecognizer)
                {
                    CustomRecognizerNode customRecognizer = (CustomRecognizerNode)selectedNode;
                    selectedResultsTextBox.Text = customRecognizer.GetRecognizedString();
                }
                else if (selectedNode.Type == Microsoft.Ink.ContextNodeType.Object)
                {
                    ObjectNode selectedObject = (ObjectNode)selectedNode;
                    selectedResultsTextBox.Text = selectedObject.GetRecognizedString();
                }
                else
                {
                    selectedResultsTextBox.Text = String.Empty;
                }

                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.Text = 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");
                }

            }
            this.currentNode = selectedNode;
        }

        private void MarkNodeAsRed(ContextNode selectedNode)
        {
            // Set all node strokes to black, but this one to red
            foreach (Stroke stroke in this.theInkCollector.Ink.Strokes)
            {
                if (selectedNode != null && 
                    selectedNode.Strokes.Contains(stroke))
                    stroke.DrawingAttributes = new DrawingAttributes(Color.Red);
                else
                    stroke.DrawingAttributes = this.theInkCollector.DefaultDrawingAttributes;
            }

            theNotesPanel.Refresh();
        }

继承层次结构

System.Object
  Microsoft.Ink.ContextNode
    Microsoft.Ink.RootNode

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

平台

Windows Vista

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

版本信息

.NET Framework

受以下版本支持:3.0

另请参见

参考

RootNode 成员

Microsoft.Ink 命名空间

InkAnalyzer.RootNode