zoukankan      html  css  js  c++  java
  • Windows 8 文件关联和程序合约

        在windows系统中,我们经常会遇到这样的情况,比如想打开一个图片文件,我们点击鼠标右键,在右键选项中,我们一般会选择打开方式,然后选择能打开图片的应用程序。今天将介绍如何将我们的应用程序注册为这样的一个程序,当我想打开图片,然后再打开方式中选择我们自己的应用程序,来打开图片。如下图:

    1.文件关联

      1).  注册打开确定的文件类型

       当程序打开的文件类型适合于我们的程序时,要想在上面的列表中看到我们的程序,操作起来很简单,只需要修改一下项目中package.appxmanifest文件即可。打开Package.appxmanifest文件,选择"声明"选项卡。在“可用声明”选择列表中,选择“文件类型关联”,然后点击添加。这时,你会看到右边一个新的表单显示在屏幕上,这个表单是与文件关联相关的。默认情况下,这里会有几个红色的X,需要你来填写相关内容。如下图:

      在支持的文件类型选项中,我们可以设置成我们自己的文件类型,比如(.win)。 微标是当一个程序是某个文件类型的默认打开程序时,我想要显示自己的logo 或者icon,就像Excel有一个Excel图标,为了达到这个效果,打开package.appxmanifest文件,在指定name的地方,指定一个logo,即可。

      当你做完了上面的步骤,那么基本的工作就完成了。现在运行一次程序,将其安装到你的系统中,然后尝试使用“打开方式”打开一个指定的类型。选择一个图片,然后再打开方式中就可以看到我们的应用程序了。

      2).  处理打开的文件。

      当我们通过选择打开方式,打开一个图片后,怎样在我们的应用程序中显示出来呢?此时,我们应该做如下工作:

         在程序的App.xaml.cs文件中,可以通过重写Application中的OnFileActivated方法,来捕获打开文件的事件,并做相应的处理,如下代码:

         protected override void OnFileActivated(FileActivatedEventArgs args)

         {

              Frame frame = Window.Current.Content as Frame;

                  if (frame == null)

                 {

                       frame =new Frame();             

                  Window.Current.Content = frame;

                }

             if (!frame.Navigate(typeof(MainPage), args))

                {

                       throw new Exception("Failed to create initial page");

                }

                Window.Current.Activate();

            }

      然后在我们的MainPage页面中进行处理打开的文件。代码如下:

         protected async override void OnNavigatedTo(NavigationEventArgs e)

         {

                FileActivatedEventArgs args = e.Parameter as FileActivatedEventArgs;

               if (args != null)

                {

                     List<StorageFile> fileList =new List<StorageFile>();

                     List<Photo> list = newList<Photo>();

                    IReadOnlyList<IStorageItem> files = args.Files;

                   if (files != null && files.Count > 0)

                    {

                    foreach (var obj in files)

                         {

                                  var listToken = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(obj);

                                 StorageFile file = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFileAsync(listToken);

                                 fileList.Add(file);

                                 Photo photo = newPhoto();

                                IRandomAccessStream stream = await file.OpenReadAsync();

                                if (stream.Size > 0)

                               {

                             BitmapImage bitmapImage = newBitmapImage();

                                     bitmapImage.SetSource(stream);

                                     photo.Url = bitmapImage;

                                     list.Add(photo);

                            }

                        }

                    }

                    if (list.Count > 0)

                    {

                      this.ViewResult.ItemsSource = list;

                    }

                }

            }

         public class Photo

          {

             public string Name { set;get;}

                public BitmapImage Url  { set;get;}

         }

      UI层XAML代码: 

         <Grid x:Name="LayoutRoot" Margin="100,0,0,0">

        <FlipView x:Name="ViewResult"Grid.Row="1" Grid.Column="1" FontSize="34" Margin="5,0,50,0"〉

               <FlipView.ItemsPanel>

                       <ItemsPanelTemplate>

                           <VirtualizingStackPanel Orientation="Horizontal"/>

                       </ItemsPanelTemplate>

                   </FlipView.ItemsPanel>

                  <FlipView.ItemTemplate>

                      <DataTemplate>

                           <Grid>

                               <Image Stretch="Fill" Source="{Binding Url}"/>

                           </Grid>

                 </DataTemplate>

                   </FlipView.ItemTemplate>

               </FlipView>

           </Grid>

       这里使用FlipView是考虑到如果选中多个文件打开的话,我们就可以浏览多个图片文件。

        到此就完成了,文件关联的功能。

     2.程序合约

          当用户尝试打开一个我们的程序不支持的文件【比如.xls 文件】,那么可以让程序显示一个兼容的程序列表,供用户选择以打开。

      你的程序不可能打开每一种文件类型。例如,Microsoft Outlook确实擅长于接收图片、文本和文件,但是如果你尝试打开邮件中的一个Excel文件时,文件将在
    Excel中打开,而不是Outlook。在这里,我们也想在自己的程序中提供类似的功能给用户。为了达到这个目的,我们需要研究一下Windows.System.Launcher类。  

      在页面上添加两个按钮,分别实现在其它应用程序中打开我们的文件的两种效果。

      private async void OpenExcelButton_Click(object sender, RoutedEventArgs e)

            {         

                  Uri uri = newUri("ms-appx:///Assets/test.xls");

                 StorageFile file = awaitStorageFile.GetFileFromApplicationUriAsync(uri);

           await Launcher.LaunchFileAsync(file);

            }   

        在这个事件中,我将在没有任何选项或设置的情况下打开我们的文件(Excel文件)。系统会使用默认的程序来打开我们的文件,而不会有任何的选择或警告。

      private async void OpenExcelButtonWithWarning_Click(object sender, RoutedEventArgs e)

          {

              Uri uri = newUri("ms-appx:///Assets/test.xls");

              StorageFile file = awaitStorageFile.GetFileFromApplicationUriAsync(uri);

              LauncherOptions options = newLauncherOptions();

                 options.TreatAsUntrusted =true;

                  bool action = awaitLauncher.LaunchFileAsync(file, options);

            }

        然而,有时候,当用户将要启动别的一个程序时,你想给用户一个提示:你将要启动另外一个程序,以让用户决定他是不是真的想要启动。这种情况的话,我们可以创建一个LauncherOptions对象,然后将其当做参数传递给LaunchFileAsync()。

        如上代码运行时,在屏幕上会弹出一个警告,让用户知道另外一个程序将被启动。

      

  • 相关阅读:
    快速搭建一个本地的FTP服务器
    Node.js安装及环境配置之Windows篇
    在win10上安装oracle10g
    win10安装oracle11g客户端
    解决:Java source1.6不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符
    idea 右侧 无 meven 菜单
    idea导入maven项目不能识别pom.xml文件解决办法
    PostgresSQL客户端pgAdmin4使用
    PostgreSQL 创建数据库
    PostgreSQL 数据类型
  • 原文地址:https://www.cnblogs.com/akwwl/p/2837367.html
Copyright © 2011-2022 走看看