背水一戰 Windows 10 (73) - 控制項(控制項基類): UIElement - 拖放的基本應用, 手動開啟 UIElement 的拖放操作

来源:http://www.cnblogs.com/webabcd/archive/2017/11/17/7850725.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 控制項(控制項基類 - UIElement ): 拖放的基本應用, 手動開啟 UIElement 的拖放操作 ...


[源碼下載]


背水一戰 Windows 10 (73) - 控制項(控制項基類): UIElement - 拖放的基本應用, 手動開啟 UIElement 的拖放操作



作者:webabcd


介紹
背水一戰 Windows 10 之 控制項(控制項基類 - UIElement )

  • 拖放的基本應用
  • 手動開啟 UIElement 的拖放操作



示例
1、演示 UIElement 的 drag & drop 的基本應用
Controls/BaseControl/UIElementDemo/DragDropDemo1.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.DragDropDemo1"
    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">

            <!--
                用於演示如何 drag 一個元素,並傳遞文本數據
            -->
            <Grid Name="dragGrid1" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid1_DragStarting" 
                  DropCompleted="dragGrid1_DropCompleted">
                <TextBlock Name="sourceTextBlock" Text="i am webabcd" Margin="20" />
            </Grid>

            <!--
                用於演示如何 drag 一個元素,並傳遞圖片數據
            -->
            <Grid Name="dragGrid2" Background="Orange" Margin="5"
                  CanDrag="True"  
                  DragStarting="dragGrid2_DragStarting" 
                  DropCompleted="dragGrid2_DropCompleted">
                <Image Name="sourceImage" Source="/Assets/hololens.jpg" Width="50" Height="50" Margin="20" />
            </Grid>

            <!--
                用於演示如何將一個可 drag 的元素 drop 到此,並獲取傳遞過來的數據
            -->
            <Grid Name="dropGrid" Background="Blue" Margin="5"
                  AllowDrop="True"
                  Drop="dropGrid_Drop"
                  DragEnter="dropGrid_DragEnter"
                  DragOver="dropGrid_DragOver"
                  DragLeave="dropGrid_DragLeave">
                <Image Name="targetImage" Width="400" Height="300" Margin="20" />
                <TextBlock Name="targetTextBlock" TextWrapping="Wrap" MinHeight="300" Margin="20" />
            </Grid>

            <TextBlock Name="lblMsg" Margin="5" />

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

Controls/BaseControl/UIElementDemo/DragDropDemo1.xaml.cs

/*
 * UIElement - UIElement(繼承自 DependencyObject, 請參見 /Controls/BaseControl/DependencyObjectDemo/)
 *     CanDrag - 此 UIElement 是否可以 drag
 *     DragStarting - 可以 drag 的 UIElement 開始 drag 時觸發的事件
 *     DropCompleted - 可以 drag 的 UIElement 完成 drop 後觸發的事件
 *     
 *     AllowDrop - 此 UIElement 是否可以 drop
 *     Drop -  可以 drop 的 UIElement 在 drop 操作發生時觸發的事件
 *     DragEnter - drag 操作進入可以 drop 的 UIElement 時觸發的事件
 *     DragOver - drag 操作在可以 drop 的 UIElement 上移動時觸發的事件
 *     DragLeave - drag 操作離開可以 drop 的 UIElement 時觸發的事件
 *
 *     
 * 註:關於 ListView 和 GridView 的 Item 的 drag & drop 請參見 /Controls/CollectionControl/ListViewBaseDemo/ListViewBaseDemo2.xaml
 *     
 *     
 * 本例用於演示 UIElement 的 drag & drop 的基本應用
 */

using System;
using System.Collections.Generic;
using System.Linq;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage;
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 DragDropDemo1 : Page
    {
        public DragDropDemo1()
        {
            this.InitializeComponent();
        }

        // dragGrid1 開始 drag 時觸發的事件
        private void dragGrid1_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            lblMsg.Text += "dragGrid1_DragStarting";
            lblMsg.Text += Environment.NewLine;

            // 通過 DataPackage 保存文本數據(關於 DataPackage 的詳細說明請參見“分享”部分)
            // 一個 DataPackage 對象可以包含多種類型的數據:ApplicationLink, WebLink, Bitmap, Html, Rtf, StorageItems, Text
            args.Data.SetText(sourceTextBlock.Text);
        }

        // dragGrid1 結束 drop 時觸發的事件
        private void dragGrid1_DropCompleted(UIElement sender, DropCompletedEventArgs args)
        {
            lblMsg.Text += "dragGrid1_DropCompleted";
            lblMsg.Text += Environment.NewLine;
        }

        // dragGrid2 開始 drag 時觸發的事件
        private void dragGrid2_DragStarting(UIElement sender, DragStartingEventArgs args)
        {
            lblMsg.Text += "dragGrid2_DragStarting";
            lblMsg.Text += Environment.NewLine;

            RandomAccessStreamReference imageStreamRef = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/hololens.jpg", UriKind.Absolute));
            // 通過 DataPackage 保存圖片數據
            args.Data.SetBitmap(imageStreamRef);
        }

        // dragGrid2 結束 drop 時觸發的事件
        private void dragGrid2_DropCompleted(UIElement sender, DropCompletedEventArgs args)
        {
            lblMsg.Text += "dragGrid2_DropCompleted";
            lblMsg.Text += Environment.NewLine;
        }

        // 拖拽進入 dropGrid 時觸發的事件
        private void dropGrid_DragEnter(object sender, DragEventArgs e)
        {
            lblMsg.Text += "dropGrid_DragEnter";
            lblMsg.Text += Environment.NewLine;

            // 指定拖拽操作的類型(None, Copy, Move, Link)
            e.AcceptedOperation = DataPackageOperation.None;

            // 根據 DataPackage 中的數據類型的不同做不同的處理(註:一個 DataPackage 中也可以同時包括各種不同類型的數據)
            if (e.DataView.Contains(StandardDataFormats.Text))
            {
                e.AcceptedOperation = DataPackageOperation.Copy;
                e.DragUIOverride.Caption = "我是文本"; // 跟隨 drag 點顯示的文本
            }
            else if (e.DataView.Contains(StandardDataFormats.Bitmap))
            {
                e.AcceptedOperation = DataPackageOperation.Copy;
                e.DragUIOverride.Caption = "我是圖片";
            }
            else if (e.DataView.Contains(StandardDataFormats.StorageItems)) // 當從 app 外部拖拽一個或多個文件進來時,系統會自動為 DataPackage 賦值
            {
                e.AcceptedOperation = DataPackageOperation.Copy;
                e.DragUIOverride.Caption = "我是文件";
            }
        }

        // 在 dropGrid 內拖拽移動時觸發的事件
        private void dropGrid_DragOver(object sender, DragEventArgs e)
        {
            // lblMsg.Text += "dropGrid_DragOver";
            // lblMsg.Text += Environment.NewLine;
        }

        // 拖拽離開 dropGrid 時觸發的事件
        private void dropGrid_DragLeave(object sender, DragEventArgs e)
        {
            lblMsg.Text += "dropGrid_DragLeave";
            lblMsg.Text += Environment.NewLine;
        }

        // 在 dropGrid 內 drop 後觸發的事件
        private async void dropGrid_Drop(object sender, DragEventArgs e)
        {
            lblMsg.Text += "dropGrid_Drop";
            lblMsg.Text += Environment.NewLine;

            if (e.DataView.Contains(StandardDataFormats.Text))
            {
                // 獲取 DataPackage 中的文本數據
                string text = await e.DataView.GetTextAsync();
                targetTextBlock.Text += text;
                targetTextBlock.Text += Environment.NewLine;
            }
            else if (e.DataView.Contains(StandardDataFormats.Bitmap))
            {
                // 獲取 DataPackage 中的圖片數據
                RandomAccessStreamReference imageStreamRef = await e.DataView.GetBitmapAsync();
                IRandomAccessStream imageStream = await imageStreamRef.OpenReadAsync();
                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.SetSource(imageStream);
                targetImage.Source = bitmapImage;
            }
            else if (e.DataView.Contains(StandardDataFormats.StorageItems))
            {
                // 獲取 DataPackage 中的文件數據(當從 app 外部拖拽一個或多個文件進來時,系統會自動為 DataPackage 賦值)
                IReadOnlyList<IStorageItem> items = await e.DataView.GetStorageItemsAsync();
                foreach (var storageFile in items.OfType<StorageFile>())
                {
                    if (storageFile != null)
                    {
                        targetTextBlock.Text += storageFile.Path;
                        targetTextBlock.Text += Environment.NewLine;
                    }
                }
            }
        }
    }
}


2、演示如何手動開啟 UIElement 的拖放操作
Controls/BaseControl/UIElementDemo/DragDropDemo2.xaml

<Page
    x:Class="Windows10.Controls.BaseControl.UIElementDemo.DragDropDemo2"
    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"
                  PointerMoved="dragGrid_PointerMoved"
                  DragStarting="dragGrid_DragStarting">
                <TextBlock Name="sourceTextBlock" Text="i am webabcd" Margin="20" />
            </Grid>

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

            <TextBlock Name="lblMsg" Margin="5" />

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

Controls/BaseControl/UIElementDemo/DragDropDemo2.xaml.cs

/*
 * UIElement - UIElement(繼承自 DependencyObject, 請參見 /Controls/BaseControl/DependencyObjectDemo/)
 *     StartDragAsync(PointerPoint pointerPoint) - 將 UIElement 拖拽到指定的 PointerPoint 位置,返回一個 DataPackageOperation 類型的枚舉(None, Copy, Move, Link)
 * 
 * 
 * CanDrag - 由系統決定何時開啟拖放操作,一般就是滑鼠按下後進行拖拽
 * StartDragAsync() - 由開發者手動決定何時何地開啟拖放操作
 *     
 *     
 * 本例用於演示如何手動開啟 UIElement 的拖放操作
 */

using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;

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

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

        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;
        }

        private async void dragGrid_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            // 通過 StartDragAsync() 開啟拖放操作,拖放操作的其他部分遵循相同的模式
            DataPackageOperation dpo = await dragGrid.StartDragAsync(e.GetCurrentPoint(dragGrid));
            if (dpo != DataPackageOperation.None)
            {
                targetTextBlock.Text += dpo;
                targetTextBlock.Text += Environment.NewLine;
            }
        }
    }
}



OK
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DEV控制項GridControl和TreeList的數據導出操作 ...
  • 學習:C#綜合揭秘——Entity Framework 併發處理詳解 帖子筆記 ,該帖子使用的是objectContext , 一、併發相關概念 併發的類型: 第一種模式稱為悲觀式併發,即當一個用戶已經在修改某條記錄時,系統將拒絕其他用戶同時修改此記錄。第二種模式稱為樂觀式併發,即系統允許多個用戶同... ...
  • Visual Studio 2017是微軟為了配合.NET戰略推出的IDE開發環境,同時也是目前開發C#程式最新的工具,本節以Visual Studio 2017社區版的安裝為例講解具體的安裝步驟。 說明:Visual Studio 2017 社區版是完全免費的,其下載地址為:https://www ...
  • 一、簡介 Topshelf可用於創建和管理Windows服務。其優勢在於不需要創建windows服務,創建控制台程式就可以。便於調試。 二、官方地址: 1、官網:http://topshelf-project.com/ 2、官方文檔:https://topshelf.readthedocs.io/e ...
  • 關於WCF即可以寄宿於IIS,也可以自我寄宿,本文采用的是自我寄宿方式。之所以採用自我寄宿方式,很大程度上,在一些特殊的場景,例如下載大文件(如幾百MB、1G等)、圖片、文檔等,如果以IIS為宿主,可能會產生記憶體不夠用。所以這裡採用自我寄宿的方式為例子。WCF是由微軟開發的一系列支持數據通信的應用程... ...
  • 問題描述 在發佈項目的時候,有一些文件是json文件,在網頁中進行載入,但是在IIS7發佈的時候,json文件居然是404,無法找到,在URL上輸入地址也一樣。 錯誤原因 IIS內部機制,不支持直接訪問json擴展名文件,沒有mime映射。因此IIS不認Json文件,如需要支持訪問json文件時,需 ...
  • 上一篇文章介紹了使用Authorize特性實現了ASP.NET MVC中針對Controller或者Action的授權功能,實際上這個特性是MVC功能的一部分,被稱為過濾器(Filter),它是一種面向切麵編程(AOP)的實現,本章將從以下幾個方面來介紹ASP.NET MVC中的過濾器。 ● ASP ...
  • 首先出個題: 如圖: 假設對成長速度顯示規定如下: 成長速度為5顯示1個箭頭; 成長速度為10顯示2個箭頭; 成長速度為12顯示3個箭頭; 成長速度為15顯示4個箭頭; 其他都顯示都顯示0各箭頭。 用代碼怎麼實現? 差一點的if,else: Js代碼 var add_level = 0; if(ad ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...