Поделиться через


Практическое руководство. Добавление данных пользователя в данные рукописного ввода

Обновлен: Ноябрь 2007

Можно добавить пользовательские рукописные данные, которые будут сохранены при сохранении рукописных данных как рукописный ввод сериализованного формата (ISF). Можно сохранить пользовательские данные для DrawingAttributes, StrokeCollection или Stroke. Возможность сохранить пользовательские данные в трех объектах дает возможность выбрать лучшее место для сохранения данных. Все три класса используют аналогичные методы для хранения и доступа к пользовательским данным.

Только следующие типы могут сохраняться как пользовательские данные:

Пример

В следующем примере показано, как добавить и получить пользовательские данные из StrokeCollection.

Private timestamp As New Guid("12345678-9012-3456-7890-123456789012")


' Add a timestamp to the StrokeCollection.
Private Sub AddTimestamp() 

    inkCanvas1.Strokes.AddPropertyData(timestamp, DateTime.Now)

End Sub 'AddTimestamp


' Get the timestamp of the StrokeCollection.
Private Sub GetTimestamp() 

    If inkCanvas1.Strokes.ContainsPropertyData(timestamp) Then
        Dim [date] As Object = inkCanvas1.Strokes.GetPropertyData(timestamp)

        If TypeOf [date] Is DateTime Then
            MessageBox.Show("This StrokeCollection's timestamp is " + CType([date], DateTime).ToString())
        End If
    Else
        MessageBox.Show("The StrokeCollection does not have a timestamp.")
    End If

End Sub 'GetTimestamp
Guid timestamp = new Guid("12345678-9012-3456-7890-123456789012");

// Add a timestamp to the StrokeCollection.
private void AddTimestamp()
{

    inkCanvas1.Strokes.AddPropertyData(timestamp, DateTime.Now);
}

// Get the timestamp of the StrokeCollection.
private void GetTimestamp()
{

    if (inkCanvas1.Strokes.ContainsPropertyData(timestamp))
    {
        object date = inkCanvas1.Strokes.GetPropertyData(timestamp);

        if (date is DateTime)
        {
            MessageBox.Show("This StrokeCollection's timestamp is " +
                ((DateTime)date).ToString());
        }
    }
    else
    {
        MessageBox.Show(
            "The StrokeCollection does not have a timestamp.");
    }
}

В следующем примере создается приложение, отображающее InkCanvas и две кнопки. Кнопка switchAuthor позволяет использовать два пера двум различным авторам. Кнопка changePenColors изменяет цвет каждого штриха в InkCanvas согласно автору. Приложение определяет два объекта DrawingAttributes и добавляет каждому пользовательское свойство, указывающее, какой автор рисовал Stroke. При щелчке пользователя на changePenColors, приложение изменяет внешний вид штриха согласно значению пользовательского свойства.

<Window x:Class="Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="Adding Custom Data to Ink" Height="500" Width="700"
    >
  <DockPanel Name="root">

    <StackPanel  Background="DarkSlateBlue">
      <Button Name="switchAuthor" Click="switchAuthor_click" >
        Switch to student's pen 
      </Button>
      <Button Name="changePenColors" Click="changeColor_click" >
        Change the color of the pen ink
      </Button>
    </StackPanel>
    <InkCanvas Name="inkCanvas1">
    </InkCanvas>
  </DockPanel>
</Window>
Imports System
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data
Imports System.Windows.Documents
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports System.Windows.Shapes
Imports System.Windows.Ink


'/ <summary>
'/ Interaction logic for Window1.xaml
'/ </summary>

Partial Class Window1
    Inherits Window '

    Private authorGuid As New Guid("12345678-9012-3456-7890-123456789012")
    Private teachersDA As New DrawingAttributes()
    Private studentsDA As New DrawingAttributes()
    Private teacher As String = "teacher"
    Private student As String = "student"
    Private useStudentPen As Boolean = False


    Public Sub New()
        InitializeComponent()

        teachersDA.Color = Colors.Red
        teachersDA.Width = 5
        teachersDA.Height = 5
        teachersDA.AddPropertyData(authorGuid, teacher)

        studentsDA.Color = Colors.Blue
        studentsDA.Width = 5
        studentsDA.Height = 5
        studentsDA.AddPropertyData(authorGuid, student)

        inkCanvas1.DefaultDrawingAttributes = teachersDA

    End Sub 'New


    ' Switch between using the 'pen' DrawingAttributes and the 
    ' 'highlighter' DrawingAttributes.
    Private Sub switchAuthor_click(ByVal sender As [Object], ByVal e As RoutedEventArgs)
        useStudentPen = Not useStudentPen

        If useStudentPen Then
            switchAuthor.Content = "Use teacher's pen"
            inkCanvas1.DefaultDrawingAttributes = studentsDA
        Else
            switchAuthor.Content = "Use student's pen"
            inkCanvas1.DefaultDrawingAttributes = teachersDA
        End If

    End Sub 'switchAuthor_click


    ' Change the color of the ink that on the InkCanvas that used the pen.
    Private Sub changeColor_click(ByVal sender As [Object], ByVal e As RoutedEventArgs)
        Dim s As Stroke
        For Each s In inkCanvas1.Strokes
            If s.DrawingAttributes.ContainsPropertyData(authorGuid) Then
                Dim data As Object = s.DrawingAttributes.GetPropertyData(authorGuid)

                If TypeOf data Is String AndAlso CStr(data) = teacher Then
                    s.DrawingAttributes.Color = Colors.Black
                End If
                If TypeOf data Is String AndAlso CStr(data) = student Then
                    s.DrawingAttributes.Color = Colors.Green
                End If
            End If
        Next s

    End Sub 'changeColor_click
End Class 'Window1 
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Ink;

/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>

public partial class Window1 : Window
{
    Guid authorGuid = new Guid("12345678-9012-3456-7890-123456789012");
    DrawingAttributes teachersDA = new DrawingAttributes();
    DrawingAttributes studentsDA = new DrawingAttributes();
    string teacher = "teacher";
    string student = "student";
    bool useStudentPen = false;

    public Window1()
    {
        InitializeComponent();

        teachersDA.Color = Colors.Red;
        teachersDA.Width = 5;
        teachersDA.Height = 5;
        teachersDA.AddPropertyData(authorGuid, teacher);

        studentsDA.Color = Colors.Blue;
        studentsDA.Width = 5;
        studentsDA.Height = 5;
        studentsDA.AddPropertyData(authorGuid, student);

        inkCanvas1.DefaultDrawingAttributes = teachersDA;
    }

    // Switch between using the 'pen' DrawingAttributes and the 
    // 'highlighter' DrawingAttributes.
    void switchAuthor_click(Object sender, RoutedEventArgs e)
    {
        useStudentPen = !useStudentPen;

        if (useStudentPen)
        {
            switchAuthor.Content = "Use teacher's pen";
            inkCanvas1.DefaultDrawingAttributes = studentsDA;
        }
        else
        {
            switchAuthor.Content = "Use student's pen";
            inkCanvas1.DefaultDrawingAttributes = teachersDA;

        }
    }

    // Change the color of the ink that on the InkCanvas that used the pen.
    void changeColor_click(Object sender, RoutedEventArgs e)
    {
        foreach (Stroke s in inkCanvas1.Strokes)
        {
            if (s.DrawingAttributes.ContainsPropertyData(authorGuid))
            {
                object data = s.DrawingAttributes.GetPropertyData(authorGuid);

                if ((data is string) && ((string)data == teacher))
                {
                    s.DrawingAttributes.Color = Colors.Black;
                }
                if ((data is string) && ((string)data == student))
                {
                    s.DrawingAttributes.Color = Colors.Green;
                }
            }
        }
    }
}