其實我們今天要說的就是一個控制項——InkPresenter,這個控制項並不是十分強大,沒辦法和WPF中的InkCanvas相比,估計在實際開發中也很少可能會用到它,不過,我們還是來瞭解一下吧,畢竟用起來也不難。
使用該控制項沒有什麼技術含量,注意一下以下幾點就是了:
1、必須明確指定InkPresenter的寬度和高度,也就是不能使用自動值和Margin,不然不能收集墨跡,除非裡面有子項目;
2、要收集墨跡,要設定Clip屬性;
3、可以使用DrawingAttributes類設定墨跡的大小和顏色。
該控制項不能像WPF那樣自動實現收集墨跡的功能,也就是說只能是我們自己寫代碼了。
<Grid><br /> <InkPresenter x:Name="MyPresenter"<br /> HorizontalAlignment="Left"<br /> VerticalAlignment="Top"<br /> MouseLeftButtonDown="MyPresenter_MouseLeftButtonDown"<br /> LostMouseCapture="MyPresenter_LostMouseCapture"<br /> MouseMove="MyPresenter_MouseMove"<br /> Background="Transparent"<br /> Opacity="1" Width="480" Height="750" /><br /> </Grid><br />
using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Net;<br />using System.Windows;<br />using System.Windows.Controls;<br />using System.Windows.Documents;<br />using System.Windows.Input;<br />using System.Windows.Media;<br />using System.Windows.Media.Animation;<br />using System.Windows.Shapes;<br />using Microsoft.Phone.Controls;<br />// 引入以下命名空間。<br />using System.Windows.Ink;</p><p>namespace InkPresentSample<br />{<br /> public partial class MainPage : PhoneApplicationPage<br /> {<br /> Stroke CurrentStroke = null;<br /> // 建構函式<br /> public MainPage()<br /> {<br /> InitializeComponent();</p><p> // 設定剪輯,以便收集墨跡<br /> RectangleGeometry rg = new RectangleGeometry();<br /> // 為了使範圍準確,應使用控制項的最終呈現高度。<br /> rg.Rect = new Rect(0, 0, MyPresenter.ActualWidth, MyPresenter.ActualHeight);<br /> MyPresenter.Clip = rg;<br /> }</p><p> private void MyPresenter_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)<br /> {<br /> // 當我們點擊時獲捉滑鼠游標<br /> MyPresenter.CaptureMouse();<br /> // 收集當前的游標所在的位置的點<br /> StylusPointCollection sc = new StylusPointCollection();<br /> sc.Add(e.StylusDevice.GetStylusPoints(MyPresenter));<br /> CurrentStroke = new Stroke(sc);<br /> // 設定筆觸的顏色,大小<br /> CurrentStroke.DrawingAttributes.Color = Colors.Yellow;<br /> CurrentStroke.DrawingAttributes.Width = 8;<br /> CurrentStroke.DrawingAttributes.Height = 8;<br /> // 把新的筆觸添加到集合中<br /> MyPresenter.Strokes.Add(CurrentStroke);<br /> }</p><p> private void MyPresenter_LostMouseCapture(object sender, MouseEventArgs e)<br /> {<br /> // 當釋放滑鼠時,也同時釋放筆觸變數的引用<br /> CurrentStroke = null;<br /> }</p><p> private void MyPresenter_MouseMove(object sender, MouseEventArgs e)<br /> {<br /> if (CurrentStroke != null)<br /> {<br /> // 每移動一次滑鼠,都收集對應的點。<br /> CurrentStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(MyPresenter));<br /> }<br /> }<br /> }<br />}