背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: 原文:背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件[源码下载] 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事...
原文: 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件

[源码下载]


背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件



作者:webabcd


介绍
背水一战 Windows 10 之 控件(控件基类 - UIElement)

  • 与 CanDrag 相关的事件(DragStartingEventArgs, DropCompletedEventArgs)
  • 与 AllowDrop 相关的事件(DragEventArgs)



示例
1、演示 UIElement 的与 CanDrag 相关的事件(DragStartingEventArgs, DropCompletedEventArgs)
Controls/BaseControl/UIElementDemo/DragDropDemo3.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.DragDropDemo3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.UIElementDemo"
    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="5">

            <Grid Name="dragGrid1" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid1_DragStarting">
                <TextBlock Name="sourceTextBlock1" Text="i am sourceTextBlock1" Margin="20" />
            </Grid>

            <Grid Name="dragGrid2" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid2_DragStarting">
                <TextBlock Name="sourceTextBlock2" Text="i am sourceTextBlock2" Margin="20" />
            </Grid>

            <Grid Name="dragGrid3" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid3_DragStarting">
                <TextBlock Name="sourceTextBlock3" Text="i am sourceTextBlock3" Margin="20" />
            </Grid>

            <Grid Name="dragGrid4" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid4_DragStarting">
                <TextBlock Name="sourceTextBlock4" Text="i am sourceTextBlock4" Margin="20" />
            </Grid>

            <Grid Name="dropGrid" Background="Blue" Margin="5"
                  AllowDrop="True"
                  Drop="dropGrid_Drop"
                  DragEnter="dropGrid_DragEnter">
                <TextBlock Name="targetTextBlock" TextWrapping="Wrap" MinHeight="300" Margin="20" />
            </Grid>

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

Controls/BaseControl/UIElementDemo/DragDropDemo3.xaml.cs

/*
 * UIElement - UIElement(继承自 DependencyObject, 请参见 /Controls/BaseControl/DependencyObjectDemo/)
 *     
 * 
 * DragStartingEventArgs - DragStarting 的事件参数(CanDrag 的 UIElement 触发的事件)
 *     Cancel - 是否取消 drag 操作
 *     Data - 获取一个 DataPackage 类型的对象,用于保存数据(详见“分享”部分)
 *     DragUI - 获取一个 DragUI 类型的对象,用于设置 drag 过程中的 ui
 *     GetDeferral() - 获取类型为 DragOperationDeferral 的异步操作对象,同时开始异步操作,之后通过 DragOperationDeferral 的 Complete() 通知完成异步操作
 *     GetPosition(UIElement relativeTo) - 获取当前 drag 的点与指定 UIELement 的相对位置(传 null 则返回相对于 app 原点的位置)
 *     
 * DragUI - 用于设置 drag 过程中的 ui
 *     SetContentFromDataPackage() - 由系统根据 DataPackage 中保存的数据的类型来决定 ui
 *     SetContentFromBitmapImage() - 指定一个 BitmapImage 对象作为 ui,同时可以指定此 ui 相对于 drag 点的位置
 *     SetContentFromSoftwareBitmap() - 指定一个 SoftwareBitmap 对象作为 ui,同时可以指定此 ui 相对于 drag 点的位置
 * 
 * DropCompletedEventArgs - DropCompleted 的事件参数(CanDrag 的 UIElement 触发的事件)
 *     DropResult - 获取 drop 的结果,一个 DataPackageOperation 类型的枚举(None, Copy, Move, Link)
 *     
 *     
 * 本例用于演示 UIElement 的与 CanDrag 相关的事件(DragStartingEventArgs, DropCompletedEventArgs)
 */

using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.Graphics.Imaging;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace Windows10.Controls.BaseControl.UIElementDemo
{
    public sealed partial class DragDropDemo3 : Page
    {
        public DragDropDemo3()
        {
            this.InitializeComponent();
        }

        private void dragGrid1_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            args.Data.SetText(sourceTextBlock1.Text);
        }

        private void dragGrid2_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            args.Data.SetText(sourceTextBlock2.Text);

            // 由系统根据 DataPackage 中保存的数据的类型来决定 drag 过程中的 ui
            args.DragUI.SetContentFromDataPackage();
        }

        private void dragGrid3_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            args.Data.SetText(sourceTextBlock3.Text);

            // drag 过程中的 ui 为指定的 BitmapImage
            args.DragUI.SetContentFromBitmapImage(new BitmapImage(new Uri("ms-appx:///Assets/hololens.jpg", UriKind.Absolute)));
        }

        private async void dragGrid4_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            args.Data.SetText(sourceTextBlock4.Text);

            // 获取异步操作对象
            DragOperationDeferral deferral = args.GetDeferral();

            // 将 dragGrid4 截图,并以此创建一个 SoftwareBitmap 对象
            RenderTargetBitmap rtb = new RenderTargetBitmap();
            await rtb.RenderAsync(dragGrid4);
            IBuffer buffer = await rtb.GetPixelsAsync();
            SoftwareBitmap bitmap = SoftwareBitmap.CreateCopyFromBuffer(buffer, BitmapPixelFormat.Bgra8, rtb.PixelWidth, rtb.PixelHeight, BitmapAlphaMode.Premultiplied);

            // drag 过程中的 ui 为指定的 SoftwareBitmap
            args.DragUI.SetContentFromSoftwareBitmap(bitmap);

            // 完成异步操作
            deferral.Complete();
        }

        private void dropGrid_DragEnter(object sender, DragEventArgs e)
        {
            e.AcceptedOperation = DataPackageOperation.Copy;
            e.DragUIOverride.Caption = "我是文本";
        }

        private async void dropGrid_Drop(object sender, DragEventArgs e)
        {
            string text = await e.DataView.GetTextAsync();
            targetTextBlock.Text += text;
            targetTextBlock.Text += Environment.NewLine;
        }
    }
}


2、演示 UIElement 的与 AllowDrop 相关的事件(DragEventArgs)
Controls/BaseControl/UIElementDemo/DragDropDemo4.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.DragDropDemo4"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.BaseControl.UIElementDemo"
    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="5">

            <Grid Name="dragGrid" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid_DragStarting">
                <TextBlock Name="sourceTextBlock" Text="i am webabcd" Margin="20" />
            </Grid>

            <Grid Name="dropGrid1" Background="Blue" Margin="5"
                  AllowDrop="True"
                  Drop="dropGrid1_Drop"
                  DragEnter="dropGrid1_DragEnter">
                <TextBlock Name="targetTextBlock1" TextWrapping="Wrap" Height="80" Margin="20" />
            </Grid>

            <Grid Name="dropGrid2" Background="Blue" Margin="5"
                  AllowDrop="True"
                  Drop="dropGrid2_Drop"
                  DragEnter="dropGrid2_DragEnter">
                <TextBlock Name="targetTextBlock2" TextWrapping="Wrap" Height="80" Margin="20" />
            </Grid>

            <Grid Name="dropGrid3" Background="Blue" Margin="5"
                  AllowDrop="True"
                  Drop="dropGrid3_Drop"
                  DragEnter="dropGrid3_DragEnter">
                <TextBlock Name="targetTextBlock3" TextWrapping="Wrap" Height="80" Margin="20" />
            </Grid>

            <Grid Name="dropGrid4" Background="Blue" Margin="5"
                  AllowDrop="True"
                  Drop="dropGrid4_Drop"
                  DragEnter="dropGrid4_DragEnter">
                <TextBlock Name="targetTextBlock4" TextWrapping="Wrap" Height="80" Margin="20" />
            </Grid>

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

Controls/BaseControl/UIElementDemo/DragDropDemo4.xaml.cs

/*
 * UIElement - UIElement(继承自 DependencyObject, 请参见 /Controls/BaseControl/DependencyObjectDemo/)
 *     
 * 
 * DragEventArgs - Drop, DragEnter, DragOver, DragLeave 的事件参数(AllowDrop 的 UIElement 触发的事件)
 *     AcceptedOperation - 一个 DataPackageOperation 类型的枚举,用于指定操作的类型
 *         None - 无操作
 *         Copy - 复制操作
 *         Move - 移动操作
 *         Link - 链接操作
 *     DataView - 获取一个 DataPackageView 类型的对象,用于获取 DataPackage 中保存的数据(详见“分享”部分)
 *     DragUIOverride - 获取一个 DragUIOverride 类型的对象,用于设置 drag 过程中的 ui(在 drop 区域内)。如果此时和 drag 过程中的 DragUI 有冲突的话,则以此 DragUIOverride 为准
 *     Handled - 是否标记为已处理
 *     Modifiers - 获取一个 DragDropModifiers 类型的枚举(FlagsAttribute),用于获取当前的按键状态
 *         None, Shift, Control, Alt, LeftButton, MiddleButton, RightButton
 *     GetDeferral() - 获取类型为 DragOperationDeferral 的异步操作对象,同时开始异步操作,之后通过 DragOperationDeferral 的 Complete() 通知完成异步操作
 *     GetPosition(UIElement relativeTo) - 获取当前 drag 的点与指定 UIELement 的相对位置(传 null 则返回相对于 app 原点的位置)
 *      
 * DragUIOverride - 用于设置 drag 过程中的 ui(在 drop 区域内)。它包括 3 个部分,分别是 Caption, Glyph, Content
 *     Caption - 标题
 *     IsCaptionVisible - 是否显示标题
 *     IsGlyphVisible - 是否显示标题的左边的那个图标(这个图标会根据你的 DataPackageOperation 的不同而不同)
 *     IsContentVisible - 是否显示内容(就是除了 Caption 和 Glyph 之外的内容)
 *     Clear() - 清除 drag 过程中的 ui(但是实际测试发现并不能清除,如果需要的话还是分别设置 IsCaptionVisible, IsGlyphVisible, IsContentVisible 吧)
 *     SetContentFromBitmapImage() - 指定一个 BitmapImage 对象作为 ui,同时可以指定此 ui 相对于 drag 点的位置
 *     SetContentFromSoftwareBitmap() - 指定一个 SoftwareBitmap 对象作为 ui,同时可以指定此 ui 相对于 drag 点的位置
 *     
 *      
 * 本例用于演示 UIElement 的与 AllowDrop 相关的事件(DragEventArgs)
 */

using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.Graphics.Imaging;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace Windows10.Controls.BaseControl.UIElementDemo
{
    public sealed partial class DragDropDemo4 : Page
    {
        public DragDropDemo4()
        {
            this.InitializeComponent();
        }

        private void dragGrid_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            args.Data.SetText(sourceTextBlock.Text);
        }

        private void dropGrid1_DragEnter(object sender, DragEventArgs e)
        {
            e.AcceptedOperation = DataPackageOperation.Copy;
            e.DragUIOverride.Caption = "我是文本";

            targetTextBlock1.Text += e.Modifiers;
            targetTextBlock1.Text += Environment.NewLine;
        }

        private void dropGrid2_DragEnter(object sender, DragEventArgs e)
        {
            e.AcceptedOperation = DataPackageOperation.Copy;
            e.DragUIOverride.Caption = "我是文本";

            // DragUIOverride 包含 3 个部分,分别是 Caption, Glyph, Content
            e.DragUIOverride.IsCaptionVisible = false;
            e.DragUIOverride.IsGlyphVisible = false;
            e.DragUIOverride.IsContentVisible = false;

            targetTextBlock2.Text += e.Modifiers;
            targetTextBlock2.Text += Environment.NewLine;
        }

        private void dropGrid3_DragEnter(object sender, DragEventArgs e)
        {
            e.AcceptedOperation = DataPackageOperation.Copy;
            e.DragUIOverride.Caption = "我是文本";

            // drag 到 drop 区域后,drag 过程中的 ui 改为指定的 BitmapImage
            e.DragUIOverride.SetContentFromBitmapImage(new BitmapImage(new Uri("ms-appx:///Assets/hololens.jpg", UriKind.Absolute)));

            targetTextBlock3.Text += e.Modifiers;
            targetTextBlock3.Text += Environment.NewLine;
        }

        private async void dropGrid4_DragEnter(object sender, DragEventArgs e)
        {
            e.AcceptedOperation = DataPackageOperation.Copy;
            e.DragUIOverride.Caption = "我是文本";

            // 获取异步操作对象
            DragOperationDeferral deferral = e.GetDeferral();
            RenderTargetBitmap rtb = new RenderTargetBitmap();
            await rtb.RenderAsync(dragGrid);
            IBuffer buffer = await rtb.GetPixelsAsync();
            SoftwareBitmap bitmap = SoftwareBitmap.CreateCopyFromBuffer(buffer, BitmapPixelFormat.Bgra8, rtb.PixelWidth, rtb.PixelHeight, BitmapAlphaMode.Premultiplied);

            // drag 到 drop 区域后,drag 过程中的 ui 改为指定的 SoftwareBitmap
            e.DragUIOverride.SetContentFromSoftwareBitmap(bitmap);

            // 完成异步操作
            deferral.Complete();

            targetTextBlock4.Text += e.Modifiers;
            targetTextBlock4.Text += Environment.NewLine;
        }

        private async void dropGrid1_Drop(object sender, DragEventArgs e)
        {
            string text = await e.DataView.GetTextAsync();
            targetTextBlock1.Text += text;
            targetTextBlock1.Text += Environment.NewLine;
        }

        private async void dropGrid2_Drop(object sender, DragEventArgs e)
        {
            string text = await e.DataView.GetTextAsync();
            targetTextBlock2.Text += text;
            targetTextBlock2.Text += Environment.NewLine;
        }

        private async void dropGrid3_Drop(object sender, DragEventArgs e)
        {
            string text = await e.DataView.GetTextAsync();
            targetTextBlock3.Text += text;
            targetTextBlock3.Text += Environment.NewLine;
        }

        private async void dropGrid4_Drop(object sender, DragEventArgs e)
        {
            string text = await e.DataView.GetTextAsync();
            targetTextBlock4.Text += text;
            targetTextBlock4.Text += Environment.NewLine;
        }
    }
}



OK
[源码下载]

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
5831 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
15天前
|
缓存 安全 网络协议
使用事件日志识别常见 Windows 错误
事件查看器是Windows操作系统中的标准诊断工具,用于记录系统事件,包括硬件问题、软件中断和系统行为等详细信息。通过分析这些日志,管理员能够追踪和解决系统错误。访问方法包括使用快捷键Win + R输入eventvwr.msc,或通过控制面板进入。事件查看器中的每条记录包含事件ID、来源和描述,帮助识别和解决问题。常见错误如蓝屏死机、DLL错误、驱动程序错误等,可通过更新驱动程序、运行系统诊断、使用恢复功能等方式解决。
|
7月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
150 0
|
C++ Windows
C++ Windows窗口程序:子窗口控件之按钮类button
C++ Windows窗口程序:子窗口控件之按钮类button
945 0
|
API C# Windows
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
C#对Windows窗口或窗口句柄的操作,都是通过 P/Invoke Win32 API 实现的,DllImport引入Windows API操作窗口(句柄),可以实现枚举已打开的窗口、向窗口...
4024 0
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
|
Windows
Windows程序设计——Windows单选按钮、复选框、分组框控件
Windows程序设计——Windows单选按钮、复选框、分组框控件
649 0
Windows程序设计——Windows单选按钮、复选框、分组框控件
|
调度 Windows
Windows多线程——临界区、事件、互斥量、信号量详解加代码
Windows多线程——临界区、事件、互斥量、信号量详解加代码
499 0
|
安全 调度 数据库
Windows开发——临界区,互斥量,信号量,事件的简单介绍与区别
Windows开发——临界区,互斥量,信号量,事件的简单介绍与区别
578 0
|
1月前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。