zoukankan      html  css  js  c++  java
  • 重新想象 Windows 8.1 Store Apps (83)

    [源码下载]


    重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性



    作者:webabcd


    介绍
    重新想象 Windows 8.1 Store Apps 之文件系统的新特性

    • 简要说明 win8.1 中关于文件系统的增强
    • “库”管理
    • 管理以及使用索引



    示例
    1、简要说明 win8.1 中关于文件系统的增强
    Demo.xaml

    <Page
        x:Class="Windows81.FileSystem.Demo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows81.FileSystem"
        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" />
    
                <TextBlock FontSize="14.667" Text="本例简要说明了 win8.1 中关于文件系统的增强,详见后台代码中的说明" Margin="0 10 0 0" />
    
            </StackPanel>
        </Grid>
    </Page>

    Demo.xaml.cs

    /*
     * 简要说明 win8.1 中关于文件系统的增强
     * 
     * 
     * 关于文件系统和选择器的基础请见:
     * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/13/3075014.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/16/3081181.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/20/3087984.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/23/3094179.html
     */
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Windows.Storage;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows81.FileSystem
    {
        public sealed partial class Demo : Page
        {
            public Demo()
            {
                this.InitializeComponent();
    
                Comment();
            }
    
            private async void Comment()
            {
                // 1、在拆分屏幕状态下,打开文件选取器时,如果当前拆分屏有一定的宽度,则文件选取器会在当前拆分屏显示,而无需全屏显示
    
    
    
                // 2、StorageFolder 和 StorageFile 都实现了 IStorageItem2 接口,其有一个 GetParentAsync() 方法用于获取当前 StorageFolder 或 StorageFile 的父文件夹
                StorageFolder storageFolder = KnownFolders.DocumentsLibrary; // 在 win8.1 中访问 DocumentsLibrary 除了要添加 <Capability Name="documentsLibrary" /> 外,还要有相应的文件关联才行
                IReadOnlyList<StorageFolder> folders = await storageFolder.GetFoldersAsync();
                if (folders.Count > 0)
                {
                    StorageFolder folder = folders.First();
                    StorageFolder parentFolder = await folder.GetParentAsync(); // 获取父亲文件夹(如果没有权限的话会返回 null)
                    lblMsg.Text = parentFolder.Name;
                }
    
    
                // 3、StorageFolder 和 StorageFile 都实现了 IStorageItem2 接口,其有一个 IsEqual() 方法用于判断两个 IStorageItem2 是否相等
                // 另外补充一个在 win8 中忘了写的一个知识点,判断一个 IStorageItem 是 StorageFolder 还是 StorageFile 可以通过 IsOfType(StorageItemTypes type) 方法来判断
    
    
    
                // 4、KnownFolders 新增了两个属性,如下:
                // KnownFolders.CameraRoll
                // KnownFolders.Playlists
    
    
    
                // 5、新增了 StorageFolder.TryGetItemAsync(string name) 方法,不用再自己写 try catch 了(但是个别异常还是会抛出的,建议还是自己写帮助类吧)
                // StorageFolder.TryGetItemAsync(string name)
    
    
    
                // 6、文件激活应用程序时,其事件参数 FileActivatedEventArgs 新增了 NeighboringFilesQuery 属性,用于获取激活文件附近的文件们
    
    
    
                // 7、文件选择器中集成了 OneDrive
            }
        }
    }


    2、演示如何 添加/删除 “库”所包含的文件夹
    StorageLibraryDemo.xaml

    <Page
        x:Class="Windows81.FileSystem.StorageLibraryDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows81.FileSystem"
        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" />
                
                <Button Name="btnAddFolder" Content="增加一个文件夹引用到图片库" Click="btnAddFolder_Click" Margin="0 10 0 0" />
    
                <Button Name="btnRemoveFolder" Content="从图片库移除之前添加的全部文件夹引用" Click="btnRemoveFolder_Click" Margin="0 10 0 0" />
    
            </StackPanel>
        </Grid>
    </Page>

    StorageLibraryDemo.xaml.cs

    /*
     * 演示如何 添加/删除 “库”所包含的文件夹
     * 
     * StorageLibrary - 用于“库”管理
     *     StorageLibrary.GetLibraryAsync(KnownLibraryId libraryId) - 静态方法,用于获取指定的“库”,返回 StorageLibrary 类型的对象
     *     Folders - 当前库所包含的文件夹们
     *     SaveFolder - 当前库的默认文件夹
     *     RequestAddFolderAsync() - 添加文件夹到当前库
     *     RequestRemoveFolderAsync() - 从当前库移除指定的文件夹
     *     DefinitionChanged -  当前库所包含的文件夹发生变化时触发的事件
     * 
     * 
     * 关于文件系统和选择器的基础请见:
     * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/13/3075014.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/16/3081181.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/20/3087984.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/23/3094179.html
     */
    
    using System;
    using System.Collections.Generic;
    using Windows.Storage;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows81.FileSystem
    {
        public sealed partial class StorageLibraryDemo : Page
        {
            // 临时保存添加进图片库的文件夹
            private List<StorageFolder> _addedFloders = new List<StorageFolder>();
    
            public StorageLibraryDemo()
            {
                this.InitializeComponent();
    
                this.Loaded += StorageLibraryDemo_Loaded;
            }
    
            async void StorageLibraryDemo_Loaded(object sender, RoutedEventArgs e)
            {
                // 注意:要想访问图片库,别忘了增加 <Capability Name="picturesLibrary" />
    
    
                // 获取图片库的 StorageLibrary 对象
                var picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
    
                // 当前库所包含的文件夹增多或减少时
                picturesLibrary.DefinitionChanged += async (StorageLibrary innerSender, object innerEvent) =>
                {
                    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        lblMsg.Text = "图片库所包含的文件夹如下:";
                        foreach (StorageFolder folder in picturesLibrary.Folders) // 当前库所包含的全部文件夹
                        {
                            lblMsg.Text += Environment.NewLine;
                            lblMsg.Text += folder.Path;
                        }
                    });
                };
            }
    
            // 增加一个文件夹引用到图片库
            private async void btnAddFolder_Click(object sender, RoutedEventArgs e)
            {
                StorageLibrary picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
    
                // 弹出文件夹选择器,以选择需要添加到图片库的文件夹
                StorageFolder addedFolder = await picturesLibrary.RequestAddFolderAsync(); 
                if (addedFolder != null)
                {
                    // 添加成功
                    _addedFloders.Add(addedFolder);
                }
                else
                {
    
                }
            }
    
            // 从图片库移除之前添加的全部文件夹引用
            private async void btnRemoveFolder_Click(object sender, RoutedEventArgs e)
            {
                StorageLibrary picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
    
                foreach (StorageFolder folder in _addedFloders)
                {
                    // 从图片库移除指定的文件夹引用
                    if (await picturesLibrary.RequestRemoveFolderAsync(folder))
                    {
                        // 移除成功
                    }
                    else
                    {
    
                    }
                }
            }
        }
    }


    3、演示如何管理索引器,以及如何通过索引器获取数据
    Indexer.xaml

    <Page
        x:Class="Windows81.FileSystem.Indexer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows81.FileSystem"
        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">
    
                <Button Name="btnAddToIndexer" Content="添加数据到索引器" Click="btnAddToIndexer_Click" />
    
                <Button Name="btnRetrieveAllItems" Content="获取索引器中的全部数据" Click="btnRetrieveAllItems_Click" Margin="0 10 0 0" />
    
                <Button Name="btnRetrieveMatchingItems" Content="按指定的查询条件获取索引器中的数据" Click="btnRetrieveMatchingItems_Click" Margin="0 10 0 0" />
    
                <ScrollViewer Margin="0 10 0 0" Width="300" Height="400" HorizontalAlignment="Left">
                    <TextBlock Name="lblMsg" FontSize="14.667" />
                </ScrollViewer>
    
            </StackPanel>
        </Grid>
    </Page>

    Indexer.xaml.cs

    /*
     * 演示如何管理索引器,以及如何通过索引器获取数据
     * 
     * 
     * 关于文件系统和选择器的基础请见:
     * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/13/3075014.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/16/3081181.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/20/3087984.html
     * http://www.cnblogs.com/webabcd/archive/2013/05/23/3094179.html
     */
    
    using System;
    using System.Collections.Generic;
    using Windows.Storage;
    using Windows.Storage.Search;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows81.FileSystem
    {
        public sealed partial class Indexer : Page
        {
            public Indexer()
            {
                this.InitializeComponent();
            }
    
            // 添加数据到索引器
            private async void btnAddToIndexer_Click(object sender, RoutedEventArgs e)
            {
                // 获取一个索引器(可以指定索引器的名字,从而达到对索引器分类的目的)
                var indexer = ContentIndexer.GetIndexer();
                var content = new IndexableContent();
                for (int i = 0; i < 100; i++)
                {
                    content.Properties[SystemProperties.Title] = "Title: " + i.ToString().PadLeft(2, '0');
                    content.Properties[SystemProperties.Keywords] = "Keywords: " + i.ToString().PadLeft(2, '0'); // 多个用“;”隔开
                    content.Properties[SystemProperties.Comment] = "Comment: " + i.ToString().PadLeft(2, '0');
                    content.Id = "key" + i; // 标识,增加同标识的索引就是更新
    
                    // 增加一个索引(另外还有 Update 和 Delete 操作)
                    await indexer.AddAsync(content);
                }
            }
    
            // 获取索引器中的全部数据
            private void btnRetrieveAllItems_Click(object sender, RoutedEventArgs e)
            {
                ExecuteQueryHelper("*");
            }
    
            // 按指定的查询条件获取索引器中的数据
            private void btnRetrieveMatchingItems_Click(object sender, RoutedEventArgs e)
            {
                ExecuteQueryHelper("title:"99"");
            }
    
    
            // 按指定的 AQS 语法从索引器中查询数据
            private async void ExecuteQueryHelper(string queryString)
            {
                lblMsg.Text = "";
                var indexer = ContentIndexer.GetIndexer();
    
                string[] propertyKeys =
                {
                    SystemProperties.Title,
                    SystemProperties.Keywords,
                    SystemProperties.Comment
                };
                // 通过 AQS 语法创建一个查询,关于 AQS 请参见:http://msdn.microsoft.com/zh-cn/library/windows/apps/aa965711.aspx
                var query = indexer.CreateQuery(queryString, propertyKeys);
    
                // 执行查询,并获取结果
                var documents = await query.GetAsync();
                foreach (var document in documents)
                {
                    string itemString = "Key: " + document.Id + "
    ";
                    foreach (var propertyKey in propertyKeys)
                    {
                        itemString += propertyKey + ": " + StringifyProperty(document.Properties[propertyKey]) + "
    ";
                    }
                    lblMsg.Text += itemString + "
    ";
                }
            }
    
            // 如果对象是一个字符串集合则用“;”做分隔符,然后以字符串形式输出
            public string StringifyProperty(object property)
            {
                string propertyString = "";
                if (property != null)
                {
                    var vectorProperty = property as IEnumerable<string>;
                    if (vectorProperty != null)
                    {
                        foreach (var prop in vectorProperty)
                        {
                            propertyString += prop + "; ";
                        }
                    }
                    else
                    {
                        propertyString = property.ToString();
                    }
                }
                return propertyString;
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    L99
    L98
    L97
    PyQt(Python+Qt)学习随笔:model/view架构中的QStandardItemModel使用案例
    PyQt(Python+Qt)学习随笔:model/view架构中的两个标准模型QStandardItemModel和QFileSystemModel
    PyQt(Python+Qt)学习随笔:Model/View架构中的Model模型概念
    PyQt(Python+Qt)学习随笔:Model/View架构概述
    第十四章、Model/View开发:Model/View架构程序设计模式
    Python中数字按位取反的方法
    PyQt(Python+Qt)学习随笔:Model中项的标记flags取值及枚举类型Qt.ItemFlag
  • 原文地址:https://www.cnblogs.com/webabcd/p/3842035.html
Copyright © 2011-2022 走看看