Windows 8 統一觸控/滑鼠/筆輸入為 Pointer 事件,六大核心事件取代舊版滑鼠事件:
| 事件 | 觸發時機 |
|---|---|
| PointerWheelChanged | 滑鼠滾輪滾動 |
| PointerPressed | 按下(滑鼠左鍵/手指觸碰) |
| PointerReleased | 釋放(滑鼠放開/手指離開) |
| PointerEntered | 進入控制項有效區域 |
| PointerMoved | 在區域內移動 |
| PointerExited | 離開控制項區域 |
<Canvas Name="MainCanvas" Width="600" Height="300" Background="Cornsilk"
PointerWheelChanged="MainCanvas_PointerWheelChanged"
PointerPressed="MainCanvas_PointerPressed"
PointerReleased="MainCanvas_PointerReleased"
PointerMoved="MainCanvas_PointerMoved"
PointerExited="MainCanvas_PointerExited"
PointerEntered="MainCanvas_PointerEntered"></Canvas>
<TextBlock Name="tbLabel" Foreground="Gold" .../> <!-- 即時座標/動作 -->
<TextBlock Name="tbLabelNext" Foreground="Gold" .../> <!-- 進入/離開 -->
<TextBlock Name="tbLabelFore" Foreground="Gold" .../> <!-- 拖曳方向判斷 -->
public sealed partial class MainPage : Page {
Point start = new Point();
// 滾輪
private void MainCanvas_PointerWheelChanged(object sender, PointerRoutedEventArgs e) {
tbLabel.Text = "滑動了一次滑鼠滾輪";
}
// 按下:記錄起始點
private void MainCanvas_PointerPressed(object sender, PointerRoutedEventArgs e) {
start = e.GetCurrentPoint(MainCanvas).Position;
tbLabel.Text = "點擊了一次滑鼠或螢幕";
}
// 釋放:計算向量角度判斷四大方向
private void MainCanvas_PointerReleased(object sender, PointerRoutedEventArgs e) {
var end = e.GetCurrentPoint(MainCanvas).Position;
double angle = 0;
if (Math.Abs(end.X - start.X) < 1 && Math.Abs(end.Y - start.Y) < 1) {
angle = 0; // 點擊未移動
} else if (end.X > start.X) {
angle = (end.Y > start.Y)
? 360 - Math.Atan((end.Y - start.Y) / (end.X - start.X)) * 180 / Math.PI
: Math.Atan((start.Y - end.Y) / (end.X - start.X)) * 180 / Math.PI;
} else if (end.X < start.X) {
angle = (end.Y > start.Y)
? Math.Atan((end.Y - start.Y) / (start.X - end.X)) * 180 / Math.PI + 180
: 180 - Math.Atan((start.Y - end.Y) / (start.X - end.X)) * 180 / Math.PI;
}
if (angle == 0) tbLabel.Text = "點擊了一次滑鼠或螢幕";
else if (angle >= 45 && angle < 135) tbLabelFore.Text = "從下往上";
else if (angle <= 45 || angle > 315) tbLabelFore.Text = "從左向右滑";
else if (angle >= 135 && angle < 225) tbLabelFore.Text = "從右向左滑";
else if (angle >= 225 && angle < 315) tbLabelFore.Text = "從上往下";
}
// 移動:即時座標
private void MainCanvas_PointerMoved(object sender, PointerRoutedEventArgs e) {
var p = e.GetCurrentPoint(MainCanvas).Position;
tbLabel.Text = $"滑鼠正在移動 X:{p.X}, Y:{p.Y}";
}
private void MainCanvas_PointerExited(object sender, PointerRoutedEventArgs e) {
tbLabelNext.Text = "滑鼠移出作用範圍";
}
private void MainCanvas_PointerEntered(object sender, PointerRoutedEventArgs e) {
tbLabelNext.Text = "滑鼠進入範圍";
}
}
原始碼下載:Win8Event.zip