共用方式為


ContextNodeBase 類別

表示在筆墨分析中所建立物件之樹狀目錄的節點。

命名空間:  System.Windows.Ink.AnalysisCore
組件:  IACore (在 IACore.dll 中)

語法

'宣告
Public Class ContextNodeBase
'用途
Dim instance As ContextNodeBase
public class ContextNodeBase
public ref class ContextNodeBase
public class ContextNodeBase
public class ContextNodeBase

範例

這個範例會取得名為 theInkAnalyzer 的 InkAnalyzerBase,並且使用其 ContextNodeBase 樹狀目錄填滿名為 theTreeView 的 System.Windows.Forms.TreeView。已選取樹狀檢視中的節點時,那些筆劃會設定為以紅色顯示。Tag (英文) 屬性是用來對應樹狀目錄節點及其所表示的內容節點。

Private Sub BuildTree()
    Me.theTreeView.Nodes.Clear()
    Dim rootNode As New TreeNode(Me.theInkAnalyzerBase.RootNode.ToString())
    Me.theTreeView.Nodes.Add(rootNode)
    rootNode.Tag = Me.theInkAnalyzerBase.RootNode

    WalkTree(Me.theInkAnalyzerBase.RootNode, rootNode)

End Sub 'BuildTree


Private Sub WalkTree(ByVal parentContextNode As ContextNodeBase, ByVal parentTreeNode As TreeNode)

    Dim cNode As ContextNodeBase

    For Each cNode In parentContextNode.SubNodes

        Dim newTNode As New TreeNode(cNode.ToString())

        If cNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkWord AndAlso _
           cNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.RecognizedString) Then

            newTNode.Text = newTNode.Text + _
                ": " + CType(cNode.GetPropertyData(PropertyGuidsForContextNodesBase.RecognizedString), _
                String)

        ElseIf cNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkDrawing AndAlso _
               cNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.ShapeName) Then

            Dim shapeName As String = CType(cNode.GetPropertyData(PropertyGuidsForContextNodesBase.ShapeName), _
                String)

            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 ContextNodeBase = CType(e.Node.Tag, ContextNodeBase)

    MarkNodeAsRed(selectedNode)

    timeStampLabel.Text = ""

    ' Show selected results
    If Not (selectedNode Is Nothing) Then

        If (selectedNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.RecognizedString) AndAlso _
           (selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.WritingRegion OrElse _
            selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Paragraph OrElse _
            selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.CustomRecognizer OrElse _
            selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Object OrElse _
            selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Line)) Then

            selectedResultsTextBox.Text = _
                CType(selectedNode.GetPropertyData(PropertyGuidsForContextNodesBase.RecognizedString), String)

        ElseIf (selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkWord) Then
            Dim parentNode As ContextNodeBase = selectedNode.ParentNode
            If (parentNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Line AndAlso _
                    parentNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.RecognizedString)) Then

                ' Put parent line's recognized string into the text box
                selectedResultsTextBox.Text = _
                    CType(parentNode.GetPropertyData(PropertyGuidsForContextNodesBase.RecognizedString), String)

                ' Select the text that corresponds to the ink word
                Dim subNodes As New ContextNodeBaseCollection(theInkAnalyzerBase)
                subNodes.Add(selectedNode)
                Dim start As Integer
                Dim length As Integer
                theInkAnalyzerBase.GetTextRangeFromNodes(subNodes, start, length)
                If (start >= 0 AndAlso length > 0) Then
                    selectedResultsTextBox.Select(start, length)
                End If
            End If
        ElseIf (selectedNode.Type = System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkDrawing AndAlso _
                selectedNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.ShapeName)) Then

            selectedResultsTextBox.Text = _
                CType(selectedNode.GetPropertyData(PropertyGuidsForContextNodesBase.ShapeName), String)

        End If
    End If

    Me.currentNode = selectedNode

End Sub 'theTreeView_AfterSelect


Private Sub MarkNodeAsRed(ByVal selectedNode As ContextNodeBase)
    Dim selectedNodeStrokes As Strokes = Nothing

    If Not selectedNode Is Nothing Then
        selectedNodeStrokes = theInk.CreateStrokes(selectedNode.GetStrokeIds())
    End If

    ' Set all node strokes to black, but this one to red
    Dim stroke As Stroke
    For Each stroke In Me.theInkCollector.Ink.Strokes
        If (Not selectedNodeStrokes Is Nothing And _
                selectedNodeStrokes.Contains(stroke)) Then

            stroke.DrawingAttributes = New DrawingAttributes(Color.Red)
        Else
            stroke.DrawingAttributes = Me.theInkCollector.DefaultDrawingAttributes
        End If
    Next

    theNotesPanel.Refresh()
End Sub


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

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

private void WalkTree(
    System.Windows.Ink.AnalysisCore.ContextNodeBase parentContextNode, TreeNode parentTreeNode)
{
    foreach (ContextNodeBase cNode in parentContextNode.SubNodes)
    {
        TreeNode newTNode = new TreeNode(cNode.ToString());
        if ((cNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkWord) &&
             cNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.RecognizedString))
        {
            // Get the recognized string
            newTNode.Text += ": " +
                (string)cNode.GetPropertyData(PropertyGuidsForContextNodesBase.RecognizedString);
        }
        else if ((cNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkDrawing) &&
                  cNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.ShapeName))
        {
            newTNode.Text += ": " +
                (string)cNode.GetPropertyData(PropertyGuidsForContextNodesBase.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, System.Windows.Forms.TreeViewEventArgs e)
{
    // Get the context node
    ContextNodeBase selectedNode = (ContextNodeBase)e.Node.Tag;

    MarkNodeAsRed(selectedNode);

    timeStampLabel.Text = "";

    // Show selected results
    if (selectedNode != null)
    {
        if (selectedNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.RecognizedString) &&
           (selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.WritingRegion ||
            selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Paragraph ||
            selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.CustomRecognizer ||
            selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Object ||
            selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Line))
        {
            selectedResultsTextBox.Text =
                (string)selectedNode.GetPropertyData(PropertyGuidsForContextNodesBase.RecognizedString);
        }
        else if (selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkWord)
        {
            ContextNodeBase parentNode = selectedNode.ParentNode;
            if (parentNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.Line &&
                parentNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.RecognizedString))
            {
                // Put parent line's recognized string into the text box
                selectedResultsTextBox.Text =
                    (string)parentNode.GetPropertyData(PropertyGuidsForContextNodesBase.RecognizedString);

                // Select the text that corresponds to the ink word
                ContextNodeBaseCollection subNodes = new ContextNodeBaseCollection(theInkAnalyzerBase);
                subNodes.Add(selectedNode);
                int start;
                int length;
                theInkAnalyzerBase.GetTextRangeFromNodes(subNodes, out start, out length);
                if (start >= 0 && length > 0)
                {
                    selectedResultsTextBox.Select(start, length);
                }
            }
        }
        else if (selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkDrawing &&
                 selectedNode.ContainsPropertyData(PropertyGuidsForContextNodesBase.ShapeName))
        {
            selectedResultsTextBox.Text =
                (string)selectedNode.GetPropertyData(PropertyGuidsForContextNodesBase.ShapeName);

        }

        if (selectedNode.Type == System.Windows.Ink.AnalysisCore.ContextNodeTypeBase.InkWord)
        {
            // Show the time stamp
            if (selectedNode.ContainsPropertyData(this.timeStampGuid))
            {
                DateTime timeStamp =
                    (DateTime)selectedNode.GetPropertyData(this.timeStampGuid);
                timeStampLabel.Text = timeStamp.ToShortTimeString();
            }

            // Snippet to demonstrate GetPropertyDataIds
            Guid[] propertyDataIds = selectedNode.GetPropertyDataIds();
            // Snippets to demonstrate loading and saving
            byte[] data = selectedNode.SavePropertiesData();
            if (!selectedNode.LoadPropertiesData(data))
                MessageBox.Show("Cannot load property data");
        }
    }
    this.currentNode = selectedNode;
}

private void MarkNodeAsRed(ContextNodeBase selectedNode)
{
    Strokes selectedNodeStrokes = null;

    if (selectedNode != null)
    {
        selectedNodeStrokes = theInk.CreateStrokes(selectedNode.GetStrokeIds());
    }

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

    theNotesPanel.Refresh();
}

繼承階層架構

System.Object
  System.Windows.Ink.AnalysisCore.ContextNodeBase

執行緒安全

這個型別的任何 Public static (在 Visual Basic 中為 Shared) 成員都具備執行緒安全。並非所有的執行個體成員都是安全執行緒。

平台

Windows Vista, Windows XP SP2, Windows Server 2003

.NET Framework 和 .NET Compact Framework 並不支援各種平台的所有版本。如需支援平台版本的相關資訊,請參閱 .NET Framework 系統需求

版本資訊

.NET Framework

支援版本:3.0

請參閱

參考

ContextNodeBase 成員

System.Windows.Ink.AnalysisCore 命名空間

System.Windows.Ink.AnalysisCore.ContextNodeBase