设为首页 收藏本站
查看: 1332|回复: 0

重新想象 Windows 8 Store Apps (49)

[复制链接]

尚未签到

发表于 2015-5-22 05:05:02 | 显示全部楼层 |阅读模式
  [源码下载]




重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop  
作者:webabcd

介绍
重新想象 Windows 8 Store Apps 之 输入


  • 输入设备的相关信息
  • SIP(Soft Input Panel)的应用
  • Tab 键导航
  • Pointer - 指针,鼠标
  • Tap - 触摸
  • Drag 和 Drop
  
示例
1、演示如何获取输入设备的相关信息
Input/InputDeviceInfo.xaml












  Input/InputDeviceInfo.xaml.cs



/*
* 演示如何获取输入设备的相关信息
*/
using System;
using Windows.Devices.Input;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace XamlDemo.Input
{
public sealed partial class InputDeviceInfo : Page
{
public InputDeviceInfo()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 获取鼠标设备的相关信息
MouseCapabilities mouseCapabilities = new MouseCapabilities();
lblMsg.Text = "MouseCapabilities.MousePresent: " + mouseCapabilities.MousePresent; // 是否存在鼠标
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "MouseCapabilities.HorizontalWheelPresent: " + mouseCapabilities.HorizontalWheelPresent; // 是否有水平滚轮
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "MouseCapabilities.VerticalWheelPresent: " + mouseCapabilities.VerticalWheelPresent; // 是否有垂直滚轮
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "MouseCapabilities.SwapButtons: " + mouseCapabilities.SwapButtons; // 是否交换了左右按钮
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "MouseCapabilities.NumberOfButtons: " + mouseCapabilities.NumberOfButtons; // 鼠标上的按钮数量
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
// 获取硬件键盘设备的相关信息
KeyboardCapabilities keyboardCapabilities = new KeyboardCapabilities();
lblMsg.Text += "KeyboardCapabilities.KeyboardPresent: " + keyboardCapabilities.KeyboardPresent; // 是否存在硬件键盘
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
// 获取触摸设备的相关信息
TouchCapabilities touchCapabilities = new TouchCapabilities();
lblMsg.Text += "TouchCapabilities.TouchPresent: " + touchCapabilities.TouchPresent; // 是否存在触摸设备
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "TouchCapabilities.Contacts: " + touchCapabilities.Contacts; // 触摸设备所支持的多点触摸的点数
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
// 获取 Pointer 设备(Touch, Pen, Mouse)的相关信息
var pointerDeviceList = PointerDevice.GetPointerDevices();
int displayIndex = 0;
foreach (PointerDevice pointerDevice in pointerDeviceList)
{
displayIndex++;
lblMsg.Text += "Pointer Device Index: " + displayIndex;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "PointerDevice.PointerDeviceType: " + pointerDevice.PointerDeviceType; // Pointer 类型(Touch, Pen, Mouse)
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "PointerDevice.IsIntegrated: " + pointerDevice.IsIntegrated; // 是否是集成设备
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "PointerDevice.MaxContacts: " + pointerDevice.MaxContacts; // 最大的同时触摸点数
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "PointerDevice.PhysicalDeviceRect: " + pointerDevice.PhysicalDeviceRect; // 物理设备的 Rect
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "PointerDevice.ScreenRect: " + pointerDevice.ScreenRect; // Pointer 设备所支持的屏幕的 Rect
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
}
}
}
}
  
2、演示 SIP(Soft Input Panel)的应用
Input/Keyboard/Demo.xaml

























  Input/Keyboard/Demo.xaml.cs



/*
* 演示 SIP(Soft Input Panel)的应用
*
* 注:
* 1、TextBox, RichEditBox, PasswordBox 等文本输入框获取焦点后,会自动显示虚拟键盘(对于 ReadOnly 的输入框,即使获取到焦点也不会弹出虚拟键盘)
* 2、键盘相关的事件有 KeyDown 和 KeyUp
* 3、WinRT 的 SIP 支持的 InputScope 类型详见 Windows.UI.Xaml.Input.InputScopeNameValue 枚举
*
*  
* Windows.UI.ViewManagement.InputPane - 软键盘面板
*     GetForCurrentView() - 获取当前的 InputPane 对象
*     OccludedRect - 软键盘面板所占用的矩形区域
*     Hiding - 软键盘隐藏时触发的事件
*     Showing - 软键盘显示时触发的事件
*
*
* 如果需要检测当前某个虚拟按键的状态,可以用如下方法:
* CoreWindow.GetAsyncKeyState(VirtualKey virtualKey)
* CoreWindow.GetKeyState(VirtualKey virtualKey)
*
* 监测键盘事件可以通过 CoreWindow.KeyDown 事件
* 关于 CoreWindow 的更多内容请参见:Feature/CoreDemo.xaml.cs
*/
using System;
using Windows.System;
using Windows.UI.Core;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
namespace XamlDemo.Input.Keyboard
{
public sealed partial class Demo : Page
{
public Demo()
{
this.InitializeComponent();
this.Loaded += Demo_Loaded;
}
async void Demo_Loaded(object sender, RoutedEventArgs e)
{
// 检测虚拟按键当前的状态
CoreVirtualKeyStates capitalLockState = Windows.UI.Xaml.Window.Current.CoreWindow.GetKeyState(VirtualKey.CapitalLock);
if (capitalLockState == CoreVirtualKeyStates.Locked)
{
await new MessageDialog("您的键盘处于“大写”输入状态").ShowAsync();
}
}
private void TextBox_KeyDown_1(object sender, KeyRoutedEventArgs e)
{
// 判断用户是否按下了 SIP 上的回车键
if (e.Key == VirtualKey.Enter)
{
// 将焦点移出文本输入框,虚拟键盘会自动隐藏
                txtReadOnly.Focus(FocusState.Programmatic);
}
}
}
}
  
3、演示 Control 的 Tab 导航相关属性的应用
Input/Keyboard/TabNavigation.xaml






















  
4、演示 Pointer 相关事件的应用
Input/Touch/Pointer.xaml













  Input/Touch/Pointer.xaml.cs



/*
* 演示 Pointer 相关事件的应用
*
*
* PointerRoutedEventArgs - 指针路由事件的事件参数
*     OriginalSource - 引发此路由事件的对象
*     Handled - 是否将事件标记为已处理
*     KeyModifiers - 获取当前按下的辅助键(Windows.System.VirtualKeyModifiers 枚举)
*         None, Control, Menu, Shift, Windows
*     Pointer - 获取 Pointer 对象
*         Pointer.PointerDeviceType - 指针设备的类型(Touch, Pen, Mouse)
*         Pointer.PointerId - 指针标识,可以根据此属性来区分多点触摸场景下的不同指针
*     GetCurrentPoint(UIElement relativeTo) - 返回当前指针相对于指定元素的 PointerPoint 对象
*         PointerPoint.Position -  指针的位置
*         PointerPoint.Properties - 返回 PointerPointProperties 对象,有一堆 PointerPoint 的相关属性
*     GetIntermediatePoints(UIElement relativeTo) - 返回与此事件关联的 PointerPoint 的中间值(平均值)集合
*   
*
* HoldingRoutedEventArgs - Holding 路由事件的事件参数
*     OriginalSource - 引发此路由事件的对象
*     Handled - 是否将事件标记为已处理
*     PointerDeviceType - 指针设备的类型(Touch, Pen, Mouse)
*     GetPosition(UIElement relativeTo) - 返回当前指针相对于指定元素的位置
*     HoldingState - Holding 状态(Windows.UI.Input.HoldingState 枚举)
*         Started, Completed, Canceled
*         
*
* UIElement.CapturePointer(Pointer value) - 捕获此 UIElement 上的指针,即在 UIElement 之外也可以响应 PointerReleased 事件
* UIElement.ReleasePointerCapture(Pointer value) - 释放对此 UIElement 上的指针的捕获
* UIElement.ReleasePointerCaptures() - 释放全部指针的捕获
*
*
* 注:通过 CoreWindow.PointerCursor 设置指针光标的样式
*/
using System;
using Windows.UI.Core;
using Windows.UI.Input;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Shapes;
namespace XamlDemo.Input.Touch
{
public sealed partial class Pointer : Page
{
public Pointer()
{
this.InitializeComponent();
// 修改指针光标的样式
Windows.UI.Xaml.Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Cross, 1);
rectangle.PointerEntered += rectangle_PointerEntered;
rectangle.PointerExited += rectangle_PointerExited;
rectangle.PointerPressed += rectangle_PointerPressed;
rectangle.PointerReleased += rectangle_PointerReleased;
rectangle.PointerMoved += rectangle_PointerMoved;
rectangle.PointerWheelChanged += rectangle_PointerWheelChanged;
rectangle.PointerCanceled += rectangle_PointerCanceled;
rectangle.PointerCaptureLost += rectangle_PointerCaptureLost;
rectangle.Holding += rectangle_Holding;
}
void rectangle_Holding(object sender, HoldingRoutedEventArgs e)
{
lblMsg.Text += "Holding";
lblMsg.Text += Environment.NewLine;
}
void rectangle_PointerCaptureLost(object sender, PointerRoutedEventArgs e)
{
lblMsg.Text += "PointerCaptureLost " + e.Pointer.PointerId;
lblMsg.Text += Environment.NewLine;
}
void rectangle_PointerCanceled(object sender, PointerRoutedEventArgs e)
{
lblMsg.Text += "PointerCanceled " + e.Pointer.PointerId;
lblMsg.Text += Environment.NewLine;
}
void rectangle_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
{
// 判断鼠标滚轮的滚动方向
lblMsg.Text += "PointerWheelChanged " + e.GetCurrentPoint(null).Properties.MouseWheelDelta;
lblMsg.Text += Environment.NewLine;
}
void rectangle_PointerMoved(object sender, PointerRoutedEventArgs e)
{
// lblMsg.Text += "PointerMoved " + e.Pointer.PointerId;
// lblMsg.Text += Environment.NewLine;
        }
void rectangle_PointerReleased(object sender, PointerRoutedEventArgs e)
{
lblMsg.Text += "PointerReleased " + e.Pointer.PointerId;
lblMsg.Text += Environment.NewLine;
((Rectangle)sender).ReleasePointerCapture(e.Pointer);
}
void rectangle_PointerPressed(object sender, PointerRoutedEventArgs e)
{
lblMsg.Text += "PointerPressed " + e.Pointer.PointerId;
lblMsg.Text += Environment.NewLine;
bool hasCapture = ((Rectangle)sender).CapturePointer(e.Pointer);
lblMsg.Text += "Got Capture: " + hasCapture;
lblMsg.Text += Environment.NewLine;
PointerPointProperties props = e.GetCurrentPoint(null).Properties;
lblMsg.Text += "接触区域的边框: " + props.ContactRect.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "原始输入的边框: " + props.ContactRectRaw.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "触笔设备的筒状按钮是否按下: " + props.IsBarrelButtonPressed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否已由指针设备取消: " + props.IsCanceled.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否来自橡皮擦: " + props.IsEraser.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否来自滚轮: " + props.IsHorizontalMouseWheel.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针是否在触摸屏的范围内: " + props.IsInRange.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "是否是反转的值: " + props.IsInverted.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否来自鼠标左键: " + props.IsLeftButtonPressed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否来自鼠标中键: " + props.IsMiddleButtonPressed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否来自鼠标右键: " + props.IsRightButtonPressed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "输入是否来自主要指针: " + props.IsPrimary.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "第一个扩展按钮的按下状态: " + props.IsXButton1Pressed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "第二个扩展按钮的按下状态: " + props.IsXButton2Pressed.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针施加到触摸屏上的力度(0.0-1.0): " + props.Pressure.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "触摸是否被拒绝了: " + props.TouchConfidence.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针状态的更改类型: " + props.PointerUpdateKind.ToString(); // PointerUpdateKind 枚举:LeftButtonPressed, LeftButtonReleased 等等
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针设备相关的 Orientation: " + props.Orientation.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针设备相关的 Twist: " + props.Twist.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针设备相关的 XTilt: " + props.XTilt.ToString();
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "指针设备相关的 YTiltYTilt: " + props.YTilt.ToString();
lblMsg.Text += Environment.NewLine;
// 输入设备相关
// props.HasUsage(uint usagePage, uint usageId)
// props.GetUsageValue(uint usagePage, uint usageId)
        }
void rectangle_PointerExited(object sender, PointerRoutedEventArgs e)
{
lblMsg.Text += "PointerExited " + e.Pointer.PointerId;
lblMsg.Text += Environment.NewLine;
}
void rectangle_PointerEntered(object sender, PointerRoutedEventArgs e)
{
lblMsg.Text += "PointerEntered " + e.Pointer.PointerId;
lblMsg.Text += Environment.NewLine;
}
}
}
  
5、演示 Tap 相关事件的应用
Input/Touch/Tap.xaml











  Input/Touch/Tap.xaml.cs



/*
* 演示 Tap 相关事件的应用
*
*
* TappedRoutedEventArgs - Tap 路由事件的事件参数
* DoubleTappedRoutedEventArgs - DoubleTap 路由事件的事件参数
* RightTappedRoutedEventArgs - RightTap 路由事件的事件参数
*     OriginalSource - 引发此路由事件的对象
*     Handled - 是否将事件标记为已处理
*     PointerDeviceType - 指针设备的类型(Touch, Pen, Mouse)
*     GetPosition(UIElement relativeTo) - 返回当前指针相对于指定元素的位置
*
*
* HoldingRoutedEventArgs - Holding 路由事件的事件参数
*     OriginalSource - 引发此路由事件的对象
*     Handled - 是否将事件标记为已处理
*     PointerDeviceType - 指针设备的类型(Touch, Pen, Mouse)
*     GetPosition(UIElement relativeTo) - 返回当前指针相对于指定元素的位置
*     HoldingState - Holding 状态(Windows.UI.Input.HoldingState 枚举)
*         Started, Completed, Canceled
*/
using System;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Input.Touch
{
public sealed partial class Tap : Page
{
public Tap()
{
this.InitializeComponent();
rectangle.IsTapEnabled = true; // 默认值就是 true
rectangle.IsDoubleTapEnabled = true; // 默认值就是 true
rectangle.IsRightTapEnabled = true; // 默认值就是 true
rectangle.IsHoldingEnabled = true; // 默认值就是 true

rectangle.Tapped += rectangle_Tapped;
rectangle.DoubleTapped += rectangle_DoubleTapped;
rectangle.RightTapped += rectangle_RightTapped;
rectangle.Holding += rectangle_Holding;
}
void rectangle_Holding(object sender, Windows.UI.Xaml.Input.HoldingRoutedEventArgs e)
{
lblMsg.Text += "Holding";
lblMsg.Text += Environment.NewLine;
}
void rectangle_RightTapped(object sender, Windows.UI.Xaml.Input.RightTappedRoutedEventArgs e)
{
lblMsg.Text += "RightTapped";
lblMsg.Text += Environment.NewLine;
}
void rectangle_DoubleTapped(object sender, Windows.UI.Xaml.Input.DoubleTappedRoutedEventArgs e)
{
lblMsg.Text += "DoubleTapped";
lblMsg.Text += Environment.NewLine;
}
void rectangle_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
lblMsg.Text += "Tapped";
lblMsg.Text += Environment.NewLine;
}
}
}
  
6、关于 AllowDrop, Drop, DragEnter, DragOver, DragLeave
Input/Touch/DragDrop.xaml







关于 AllowDrop, Drop, DragEnter, DragOver, DragLeave 等详见:Controls/GridView/DragItem.xaml




  
  
OK
[源码下载]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69289-1-1.html 上篇帖子: 重新想象 Windows 8 Store Apps (65) 下篇帖子: Windows phone 8 学习笔记 提纲页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表