Partager via


RootNode, classe

Mise à jour : November 2007

Représente le ContextNode supérieur d'une arborescence de nœuds qui décrit les résultats de l'analyse d'entrée manuscrite.

Espace de noms :  System.Windows.Ink
Assembly :  IAWinFX (dans IAWinFX.dll)

Syntaxe

'Déclaration
Public NotInheritable Class RootNode _
    Inherits ContextNode
'Utilisation
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

Notes

La propriété InkAnalyzer.RootNode accède au RootNode.

Un objet RootNode peut contenir n'importe quel nombre de types d'objets enfants suivants :

Exemples

L'exemple suivant démarre au RootNode pour un InkAnalyzer nommé theInkAnalyzer et remplit un TreeView nommé theTreeView avec l'arborescence ContextNode de l'analyseur. Lorsqu'un nœud du TreeView est sélectionné, les traits sont configurés de manière à s'afficher en rouge. La propriété Tag est utilisée pour mapper les nœuds de l'arborescence aux nœuds de contexte qu'ils représentent.

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;
    }
}

Hiérarchie d'héritage

System.Object
  System.Windows.Ink.ContextNode
    System.Windows.Ink.RootNode

Sécurité des threads

Tous les membres static (Shared en Visual Basic) publics de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.

Plateformes

Windows Vista

Le .NET Framework et le .NET Compact Framework ne prennent pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Informations de version

.NET Framework

Pris en charge dans : 3.0

Voir aussi

Référence

Membres RootNode

System.Windows.Ink, espace de noms

InkAnalyzer.RootNode