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

简介: 原文:重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop[源码下载] 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, ...
原文: 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop

[源码下载]


重新想象 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

<Page
    x:Class="XamlDemo.Input.InputDeviceInfo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Input"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <Grid Margin="120 0 0 0">

            <ScrollViewer Margin="0 0 10 10">
                <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" />
            </ScrollViewer>

        </Grid>
    </Grid>
</Page>

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

<Page
    x:Class="XamlDemo.Input.Keyboard.Demo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Input.Keyboard"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <!--
                TextBox - 文本输入框
                    IsTextPredictionEnabled - 是否启用“自动完成”,默认值 true
                    IsSpellCheckEnabled - 是否启用拼音检查,默认值 false
            -->
            <TextBox IsTextPredictionEnabled="True" IsSpellCheckEnabled="True" Margin="0 0 10 0" />


            <!--
                InputScope - 限制 SIP 的输入范围,即设置 SIP 的布局方式
            -->
            <TextBox InputScope="Default" Margin="0 10 10 0"  />
            
            <TextBox KeyDown="TextBox_KeyDown_1" Margin="0 10 10 0">
                <TextBox.InputScope>
                    <InputScope>
                        <InputScope.Names>
                            <InputScopeName NameValue="TelephoneNumber" />
                        </InputScope.Names>
                    </InputScope>
                </TextBox.InputScope>
            </TextBox>

            <!--
                对于 ReadOnly 的输入框,即使获取到焦点也不会弹出虚拟键盘
            -->
            <TextBox Name="txtReadOnly" IsReadOnly="True" Margin="0 10 10 0" />
            
        </StackPanel>
    </Grid>
</Page>

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

<Page
    x:Class="XamlDemo.Input.Keyboard.TabNavigation"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Input.Keyboard"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">
            
            <!--
                演示 Control 的 Tab 导航相关属性的应用
            
                Control - 控件
                    TabIndex - Tab 导航的顺序,默认值为 int.MaxValue
                    IsTabStop - 是否加入 Tab 导航,默认值为 true
                    TabNavigation - Tab 导航的工作方式。经测试,没什么效果
            -->
            
            <Button Content="button 1" TabIndex="3" TabNavigation="Once" />
            <Button Content="button 2" Margin="0 10 0 0" TabIndex="1" />
            <Button Content="button 3" Margin="0 10 0 0" IsTabStop="False" />
            <Button Content="button 4" Margin="0 10 0 0" TabIndex="4" />
            <Button Content="button 5" Margin="0 10 0 0" TabIndex="2" />

            <ListBox Width="200" Height="300" Margin="0 10 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
                <ListBox.Items>
                    <ListBoxItem Content="ListBoxItem1" />
                    <ListBoxItem Content="ListBoxItem2" />
                    <ListBoxItem Content="ListBoxItem3" />
                </ListBox.Items>
            </ListBox>
            
        </StackPanel>
    </Grid>
</Page>


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

<Page
    x:Class="XamlDemo.Input.Touch.Pointer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Input.Touch"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <Grid Margin="120 0 0 0">

            <Rectangle Name="rectangle" Width="400" Height="100" Fill="Orange" HorizontalAlignment="Left" VerticalAlignment="Top" />

            <ScrollViewer Margin="0 110 0 10" HorizontalAlignment="Stretch" VerticalAlignment="Top">
                <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" />
            </ScrollViewer>

        </Grid>
    </Grid>
</Page>

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

<Page
    x:Class="XamlDemo.Input.Touch.Tap"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Input.Touch"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <Rectangle Name="rectangle" Width="400" Height="100" Fill="Orange" HorizontalAlignment="Left" />

            <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap" Margin="0 10 0 0" />

        </StackPanel>
    </Grid>
</Page>

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

<Page
    x:Class="XamlDemo.Input.Touch.DragDrop"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Input.Touch"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <TextBlock Name="lblMsg" FontSize="14.667" TextWrapping="Wrap">
                <Run>关于 AllowDrop, Drop, DragEnter, DragOver, DragLeave 等详见:Controls/GridView/DragItem.xaml</Run>
            </TextBlock>

        </StackPanel>
    </Grid>
</Page>

 


OK
[源码下载]

目录
相关文章
|
6月前
|
人工智能 文字识别 小程序
旅游社用什么工具收报名 + 资料?不开发 App 也能自动收集信息
本文探讨了旅游行业中报名信息收集的常见痛点及解决方案,重点介绍了二维码表单工具在提升信息收集效率、简化操作流程方面的优势。通过对比多种工具,分析其适用场景与实际应用逻辑,为一线旅游从业者提供高效、低成本的执行参考。
|
7月前
|
数据库
《仿盒马》app开发技术分享-- 插入积分信息(65)
上一节我们实现了积分页面的大概框架,那么现在我们开始进行数据的填充和查询,积分相关的内容现在之后当回收订单结算之后才会进行积分数据的添加,那我们想查询出对应的积分数据,还需要新增一张积分信息表
149 0
|
9月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
293 22
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
316 0
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
248 11
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
202 2
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
164 2
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
283 1
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
203 0
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
204 0

热门文章

最新文章