1. 程式人生 > >【Win10】檔案拖放開啟

【Win10】檔案拖放開啟

原文: 【Win10】檔案拖放開啟

在 Windows 10 中,通用應用程式在桌面環境下是支援從資源管理器拖放檔案開啟的。

這篇博文將演示拖放圖片或文字檔案,並在程式中開啟顯示。

前臺 XAML:

<Page x:Class="DropDemo.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:DropDemo"
      xmlns:d
="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" AllowDrop="True" DragOver="Grid_DragOver" Drop
="Grid_Drop"> <Image x:Name="img" Visibility="Collapsed" /> <TextBlock x:Name="txt" Visibility="Collapsed" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30"
/> </Grid> </Page>

需要注意的是,能夠接受拖放的控制元件的 Background 屬性必須不能為 null,例如上面程式碼中,如果我們將 Grid 的 Background 屬性去掉的話,則拖放就不起作用了。假如要實現一個拖放區域的話,那麼我們可以將控制元件的 Background 屬性設定為 Transparent,即為透明。這一點跟處理透明控制元件的點選事件是類似的。

後臺程式碼:

DragOver 方法:

private void Grid_DragOver(object sender, DragEventArgs e)
{
    e.AcceptedOperation = DataPackageOperation.Copy;

    // 設定拖放時顯示的文字。
    e.DragUIOverride.Caption = "拖放開啟";

    // 是否顯示拖放時的文字。預設為 true。
    // e.DragUIOverride.IsCaptionVisible = false;

    // 是否顯示檔案預覽內容,一般為檔案圖示。預設為 true。
    // e.DragUIOverride.IsContentVisible = false;

    // Caption 前面的圖示是否顯示。預設為 true。
    // e.DragUIOverride.IsGlyphVisible = false;

    e.DragUIOverride.SetContentFromBitmapImage(new BitmapImage(new Uri("ms-appx:///Assets/dropContent.jpg")));

    e.Handled = true;
}

1、Caption 屬性

如果沒設定的話,則會根據 AcceptedOperation 的值來顯示,例如 Copy 的話顯示覆制,Move 的話,顯示移動。

2、IsGlyphVisible 屬性

true:

QQ截圖20150625163802

false:

QQ截圖20150625163826

可以明確看見文字前面的圖示是否顯示。

3、SetContentFromBitmapImage 方法

這個方法可以傳入一個圖片,拖放的時候就可以顯示圖片了,例如我上面設定了一幅金館長。如果沒指定的話,則會顯示檔案的圖示。

Drop 方法:

private async void Grid_Drop(object sender, DragEventArgs e)
{
    var defer = e.GetDeferral();

    try
    {
        DataPackageView dataView = e.DataView;
        // 拖放型別為檔案儲存。
        if (dataView.Contains(StandardDataFormats.StorageItems))
        {
            var files = await dataView.GetStorageItemsAsync();
            var file = files.OfType<StorageFile>().First();
            if (file.FileType == ".png" || file.FileType == ".jpg")
            {
                // 拖放的是圖片檔案。
                BitmapImage bitmap = new BitmapImage();
                await bitmap.SetSourceAsync(await file.OpenAsync(FileAccessMode.Read));
                img.Source = bitmap;

                img.Visibility = Visibility.Visible;
                txt.Visibility = Visibility.Collapsed;
            }
            else if (file.FileType == ".txt")
            {
                // 拖放的是文字檔案。
                string text = await FileIO.ReadTextAsync(file);
                txt.Text = text;

                img.Visibility = Visibility.Collapsed;
                txt.Visibility = Visibility.Visible;
            }
        }
    }
    finally
    {
        defer.Complete();
    }
}

由於 DragEventArgs 物件有 GetDeferral 方法,並且我們使用到非同步方法,所以要先獲取 defer 物件,非同步方法完成後再呼叫 defer 物件的 Complete 方法。這點跟後臺任務是類似的。

效果:

jdfw

Demo 下載:http://download.csdn.net/detail/h82258652/8838711