背水一戰 Windows 10 (94) - 選取器: 自定義文件打開選取器

[源碼下載]


html

背水一戰 Windows 10 (94) - 選取器: 自定義文件打開選取器



做者:webabcd


介紹
背水一戰 Windows 10 之 選取器html5

  • 自定義文件打開選取器



示例
一、演示如何開發自定義文件打開選取器
App.xaml.csc++

        // 經過文件打開選取器激活應用程序時所調用的方法
        protected override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args)
        {
            var rootFrame = new Frame();
            rootFrame.Navigate(typeof(Windows10.Picker.MyOpenPicker), args);
            Window.Current.Content = rootFrame;

            Window.Current.Activate();
        }

Picker/MyOpenPicker.xamlweb

<Page
    x:Class="Windows10.Picker.MyOpenPicker"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Picker"
    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="10 0 10 10">

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

            <Button Name="btnPickLocalFile" Content="選擇一個本地文件" Click="btnPickLocalFile_Click" Margin="5" />

            <Button Name="btnPickRemoteFile" Content="選擇一個遠程文件" Click="btnPickRemoteFile_Click" Margin="5" />

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

Picker/MyOpenPicker.xaml.csexpress

/*
 * 演示如何開發自定義文件打開選取器
 * 
 * 一、在 Package.appxmanifest 中新增一個「文件打開選取器」聲明,並作相關配置
 * 二、在 App.xaml.cs 中 override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args),若是 app 是由文件打開選取器激活的,則會調用此方法
 * 
 * FileOpenPickerActivatedEventArgs - 經過「文件打開選取器」激活應用程序時的事件參數
 *     FileOpenPickerUI - 獲取 FileOpenPickerUI 對象
 *     Kind - 此 app 被激活的類型(ActivationKind 枚舉)
 *         好比,若是是經過「文件打開選取器」激活的話,則此值爲 FileOpenPicker
 *     PreviousExecutionState - 此 app 被激活前的狀態(ApplicationExecutionState 枚舉)
 *         好比,若是此 app 被激活前就是運行狀態的或,則此值爲 Running
 *     SplashScreen - 獲取此 app 的 SplashScreen 對象
 *     CallerPackageFamilyName - 獲取激活了此 app 的應用的包名(可是實際測試發現,獲取到的倒是此 app 的包名)
 *     User - 獲取激活了此 app 的 User 對象
 *     
 * FileOpenPickerUI - 自定義文件打開選取器的幫助類
 *     AllowedFileTypes - 容許的文件類型,只讀
 *     SelectionMode - 選擇模式(FileSelectionMode.Single 或 FileSelectionMode.Multiple)
 *     Title - 將在「自定義文件打開選取器」上顯示的標題
 *     CanAddFile(IStorageFile file) - 是否能夠將指定的文件添加進選中文件列表
 *     AddFile(string id, IStorageFile file) - 將文件添加進選中文件列表,並指定 id
 *     ContainsFile(string id) - 選中文件列表中是否包含指定的 id
 *     RemoveFile(string id) - 根據 id 從選中文件列表中刪除對應的文件
 *     Closing - 用戶關閉「自定義文件打開選取器」時觸發的事件
 *     
 *     
 * 注意:測試時發現若是此 app 做爲文件打開選取器激活以前是運行狀態的話,則在做爲文件打開選取器時會出現控件事件沒法觸發的狀況(可是有的時候是正常的),不知道爲何,這一點開發和測試時要注意
 */

using System;
using System.Collections.Generic;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Storage;
using Windows.Storage.Pickers.Provider;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace Windows10.Picker
{
    public sealed partial class MyOpenPicker : Page
    {
        private FileOpenPickerUI _fileOpenPickerUI;

        public MyOpenPicker()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 獲取 FileOpenPickerUI 對象(從 App.xaml.cs 傳來的)
            FileOpenPickerActivatedEventArgs args = (FileOpenPickerActivatedEventArgs)e.Parameter;
            _fileOpenPickerUI = args.FileOpenPickerUI;

            _fileOpenPickerUI.Title = "自定義文件打開選取器";

            // 注意:選擇的文件的擴展名必須匹配 AllowedFileTypes 中的定義(其是在調用端的 FileOpenPicker.FileTypeFilter 中配置的)
            IReadOnlyList<string> allowedFileTypes = _fileOpenPickerUI.AllowedFileTypes;
            lblMsg.Text = "allowedFileTypes: " + string.Join(",", allowedFileTypes);
            lblMsg.Text += Environment.NewLine;

            lblMsg.Text += "Kind: " + args.Kind;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "SplashScreen.ImageLocation: " + args.SplashScreen.ImageLocation;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "PreviousExecutionState: " + args.PreviousExecutionState;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "CallerPackageFamilyName: " + args.CallerPackageFamilyName;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "User.NonRoamableId: " + args.User.NonRoamableId;
            lblMsg.Text += Environment.NewLine;

            // _fileOpenPickerUI.Closing += _fileOpenPickerUI_Closing;

            base.OnNavigatedTo(e);
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            // _fileOpenPickerUI.Closing -= _fileOpenPickerUI_Closing;

            base.OnNavigatedFrom(e);
        }

        // 選擇一個本地文件
        private async void btnPickLocalFile_Click(object sender, RoutedEventArgs e)
        {
            StorageFile file = await Package.Current.InstalledLocation.GetFileAsync(@"Assets\hololens.jpg");
            if (_fileOpenPickerUI.CanAddFile(file))
            {
                AddFileResult result = _fileOpenPickerUI.AddFile("myFile", file);

                lblMsg.Text = "選擇的文件: " + file.Name;
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += "AddFileResult: " + result.ToString();
            }
        }

        // 選擇一個遠程文件
        private async void btnPickRemoteFile_Click(object sender, RoutedEventArgs e)
        {
            Uri uri = new Uri("http://images.cnblogs.com/mvpteam.gif", UriKind.Absolute);

            // 擴展名必須匹配 FileOpenPicker.FileTypeFilter 中的定義
            StorageFile file = await StorageFile.CreateStreamedFileFromUriAsync("mvp.gif", uri, RandomAccessStreamReference.CreateFromUri(uri));
            if (_fileOpenPickerUI.CanAddFile(file))
            {
                AddFileResult result = _fileOpenPickerUI.AddFile("myFile", file);

                lblMsg.Text = "選擇的文件: " + file.Name;
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += "AddFileResult: " + result.ToString();
            }
        }
    }
}


二、演示如何調用自定義文件打開選取器
Picker/MyOpenPickerDemo.xamlwindows

<Page
    x:Class="Windows10.Picker.MyOpenPickerDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Picker"
    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="10 0 10 10">

            <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5">
                <Run>
                    若是須要激活自定義的文件選取窗口,請在彈出的選取器窗口的左側的導航列表中選擇相應的 app
                </Run>
                <LineBreak />
                <Run>
                    測試時發現若是此 app 做爲文件打開選取器激活以前是運行狀態的話,則在做爲文件打開選取器時會出現控件事件沒法觸發的狀況(可是有的時候是正常的),不知道爲何,這一點開發和測試時要注意
                </Run>
            </TextBlock>

            <Button Name="btnMyOpenPicker" Content="彈出文件選擇窗口" Click="btnMyOpenPicker_Click" Margin="5" />

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

Picker/MyOpenPickerDemo.xaml.csapp

/*
 * 演示如何調用自定義文件打開選取器
 * 
 * 自定義文件打開選取器參見 MyOpenPicker.xaml
 */

using System;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Windows10.Picker
{
    public sealed partial class MyOpenPickerDemo : Page
    {
        public MyOpenPickerDemo()
        {
            this.InitializeComponent();
        }

        private async void btnMyOpenPicker_Click(object sender, RoutedEventArgs e)
        {
            // 選擇一個文件
            FileOpenPicker openPicker = new FileOpenPicker();
            openPicker.CommitButtonText = "選中此文件";
            openPicker.FileTypeFilter.Add("*");

            // 彈出文件選擇窗口
            StorageFile file = await openPicker.PickSingleFileAsync(); 
            if (file != null)
            {
                lblMsg.Text = "選中文件: " + file.Name;
            }
            else
            {
                lblMsg.Text = "取消了";
            }
        }
    }
}



OK
[源碼下載]asp.net

相關文章
相關標籤/搜索