导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的墨迹支持

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

墨迹指用触笔或触摸输入的手写或绘制内容。Windows Phone 应用可以使用 InkPresenter 元素支持墨迹。

本主题包括以下部分。

下图演示显示墨迹笔画的 InkPresenter

UX_InkPresenter

InkPresenter 元素

InkPresenter 元素提供了一个绘图图面来支持墨迹功能。InkPresenter 派生自 Canvas 并可以显示一个或多个 UIElement 对象和 StrokeCollection

下面的代码示例演示如何采用 XAML 创建 InkPresenter 元素。

<Canvas>
    <TextBlock Text="InkPresenter Control" FontWeight="Bold" Margin="50,30,0,0" />
    <Rectangle Height="500" Width="500" Margin="50,50,0,0" Stroke="Black" />
    <InkPresenter x:Name="MyIP" Height="500" Width="500"
              Margin="50,50,0,0"
              MouseLeftButtonDown="MyIP_MouseLeftButtonDown" 
              LostMouseCapture="MyIP_LostMouseCapture" 
              MouseMove="MyIP_MouseMove" 
              Background="Transparent" Opacity="1" />
</Canvas>

在前一个示例中,使用与 InkPresenter 元素相同的边距将一个 Rectangle 添加到了 Canvas 中。这是因为 InkPresenter 不具有可提供可视化边界的属性。RectangleStroke 属性设置为 Black,相当于 InkPresenter 的边框。InkPresenter 的 z 顺序必须大于 Rectangle 的 z 顺序。否则,Rectangle 将隐藏 InkPresenter

墨迹数据

Windows Phone 中的墨迹是一个 StrokeCollection 对象,该对象包含单个的 Stroke 对象。每一个 Stroke 均对应于一个触笔向下、触笔移动和触笔向上的序列。一个 Stroke 可以是一个点、一条直线或一条曲线。每个 Stroke 都包含一个 StylusPointCollection 对象,该对象包含单个的 StylusPoint 对象。StylusPoint 对象是在触笔移动而接触到数字转换器时收集得到的。Stroke 还具有许多特性,例如高度、宽度、颜色和轮廓颜色等,所有这些特性都包含在 DrawingAttributes 类中。

收集墨迹

您可以通过对 InkPresenter 响应事件来以编程方式创建或捕获笔画。要处理的事件为 MouseLeftButtonDownMouseMoveLostMouseCapture

InkPresenter 元素接收到 MouseLeftButtonDown 事件时,会创建一个新的 Stroke 对象,并将该对象添加到 InkPresenter 元素的 StrokeCollection 对象中。当触笔在接触到屏幕的情况下移动时,会调用 MouseMove 事件,并收集 StylusPoint 对象,同时将这些对象添加到该 Stroke 中。引发 LostMouseCapture 事件时,Stroke 创建完毕。

下面的代码示例演示用于捕获 InkPresenter 图面上的输入并使用该输入创建要显示的笔画的基本技术。

public Page()
{
    InitializeComponent();
    SetBoundary();
}
Stroke NewStroke;

//A new stroke object named MyStroke is created. MyStroke is added to the StrokeCollection of the InkPresenter named MyIP
private void MyIP_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
    MyIP.CaptureMouse();
    StylusPointCollection MyStylusPointCollection = new StylusPointCollection();
    MyStylusPointCollection.Add(e.StylusDevice.GetStylusPoints(MyIP));
    NewStroke = new Stroke(MyStylusPointCollection);
    MyIP.Strokes.Add(NewStroke);
}

//StylusPoint objects are collected from the MouseEventArgs and added to MyStroke. 
private void MyIP_MouseMove(object sender, MouseEventArgs e)
{
    if (NewStroke != null)
        NewStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(MyIP));
}

//MyStroke is completed
private void MyIP_LostMouseCapture(object sender, MouseEventArgs e)
{
    NewStroke = null;
    
}

//Set the Clip property of the inkpresenter so that the strokes
//are contained within the boundary of the inkpresenter
private void SetBoundary()
{
    RectangleGeometry MyRectangleGeometry = new RectangleGeometry();
    MyRectangleGeometry.Rect = new Rect(0, 0, MyIP.ActualWidth, MyIP.ActualHeight);
    MyIP.Clip = MyRectangleGeometry;
}

可以使用指定位置处的示例代码来完成以下与 InkPresenter 相关的任务。

任务

示例位置

使用 InkPresenter 元素。

InkPresenter

指定绘制属性,例如高度、宽度、颜色和轮廓颜色等。

DrawingAttributes

循环访问触笔接触点并操作笔画集合。

StylusPoints

使用触笔接触点的属性,例如,X 坐标、Y 坐标和压力。

StylusPoint

检索笔画的边界框。

Stroke.GetBounds

检索笔画集合的边界框。

StrokeCollection.GetBounds

确定笔画对象是否交叉。

Stroke.HitTest

确定笔画集合是否交叉。

StrokeCollection.HitTest

显示:
© 2015 Microsoft