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 fileList =new List();
List list = newList();
IReadOnlyList 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代码:
		页: 
[1]