注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

Windows8:基于C#的Share Contract实现  

2011-11-17 19:02:06|  分类: Windows 8 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文主要介绍基于XAML+C#实现ShareContract功能。关于Windows8的Share Contract,《Windows8:Share Contract — 分享AP的功能、内容》一文中有详细的介绍,并且文中提供了HTML5+Javascript的代码实现。

ShareContract的流程如下图,主要由ShareSource、ShareTarget两方来实现数据和文件的沟通,中间由Windows8系统保证两者的交互。
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
 
ShareSource
首先是SourceApp,任何能提供内容的Ap都可以作为Share的源。提供的数据可以是Text、Uri、HTML、Image等等格式的数据,也可以是任意类型的文件。
private void initShareContract()
{
    DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
    dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(dataTransferManager_DataRequested);

    //delegate dataProviderHander = new DataProviderHandler<DataPackage, DataProviderArgs>();
}

void dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    // some thing to do
}
创建的DataTransferManager类用于向系统注册SourceApp,增加一个Handler实现share数据的封装。至此,向系统注册SourceApp已经完成。当User划出Charm菜单并且点击Share时,以上代码中的dataTransferManager_DataRequested方法就会被系统调用。代码中还有一个名为dataProviderHander的委托,该委托可以作为参数供DataPackage.setDataProvider函数使用,它可以告诉ShareTarget App该委托定义的方法来获取所需要的数据。

以下是封装Share数据的代码,最简单的方式实现了share一段文字。tbShare是一个TextBox,代码将界面中某TextBox的内容分享出去。
void dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    args.Request.Data.Properties.Title = "share Text";
    args.Request.Data.Properties.Description = "text a text";
    args.Request.Data.SetText(tbShare.Text);
    //args.Request.Data.Properties.Thumbnail = StreamReference.CreateFromFile(imageFile);
}
DataPackage.Properties.Thumbnail可以设置DataPackage数据的缩略图。

代码中的DataDataPackage,它可以实现多种类型的数据封装:
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
从上到下依次为:
public void SetBitmap(IRandomAccessStream value)
打包图片数据流;
public void SetData(string formatId, IRandomAccessStream value)
打包定义格式的数据流;
public void SetDataProvider(string formatId, DataProviderHandler delayRenderer)
提供TargetApp获取信息的方法。 DataProviderHandler就是前面提到过的获取数据的委托;
public void SetHtml(string value)
打包HTML格式的数据;
public void SetRtf(string value)
打包富文本数据;
public void SetStorageItems(IEnumerable<IStorageItem> value)
打包多个文件;
public void SetText(string value)
public void SetText(string formatId, string value)
这两个方法都用于打包文字;
public void SetUri(Uri value)
打包Uri路径。

以上的代码实现之后,就可以将SourceApp中你想Share的数据提供出来,效果如下:
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
 
ShareTarget
如果可能,最好每一支Ap都是Share的SourceApp,这样Windows8上的信息会越来越流通,越来越丰富。但是并不是每一支Ap都适合作为Share 的TargetApp。ShareTarget实现通常适用于社交网络类Ap、即时通讯、云端存储、打印设备等等。如果你的Ap有需要接受来自其它Ap提供的信息,那就做成TargetApp吧。

下面介绍代码实现。(本文重点是功能实现,上面的ShareSource也是如此。所以代码里并不会关心布局问题。但事实上TargetApp被叫起的页面并不是全屏显示,所以开发者还是需要注意页面的布局问题。)

打开TargetApp工程中的Package.appxmanifest文件,将程序声明为Share Target:
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
可以直接在这个图形化界面中配置支持的数据格式(“Data Formats”)及文件格式(“Supported File Types”)。如果可以接收任何文件,就勾选“SupportsAnyFileType”。如果要接收前面ShareApp中打包的Text、Uri、Image、HTML等数据,就必须在“Data Formats”栏位中加入对这些数据格式的支持,如下图所示:
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
 
设置完成后查看Package.appxmanifest文件的代码,可以看到XML格式的声明:
<Extensions>
    <Extension Category="windows.shareTarget" Executable="ShareTarget.exe" EntryPoint="ShareTarget.App">
        <ShareTarget>
            <SupportedFileTypes SupportsAnyFileType="true" />
            <DataFormat>text</DataFormat>
            <DataFormat>uri</DataFormat>
            <DataFormat>bitmap</DataFormat>
            <DataFormat>xlsx</DataFormat>
            <DataFormat>html</DataFormat>
        </ShareTarget>
    </Extension>
</Extensions>

为了接收到系统的调用, 在App.xaml.cs文件中重写OnSharingTargetActivated方法:
protected override async void OnSharingTargetActivated(ShareTargetActivatedEventArgs args)
{
    TargetPage shareTargetPage = new TargetPage();
    await shareTargetPage.ActivateAsync(args);
}
TargetPage是在本Demo中定义的一个页面,可以用Ap的主页面,但是一般来说Ap主页面不会被用于ShareTarget的处理页面。Demo中TargetPage定义了ActivateAsync(args)方法来处理ShareSource打包后的数据args。

ActiviteAsync函数主体如下:
public async Task ActivateAsync(ShareTargetActivatedEventArgs args)
{
    if (args.Kind == Windows.ApplicationModel.Activation.ActivationKind.ShareTarget) {
        shareOperation = args.ShareOperation;

        // get Title and Description
        tbTitle.Text = shareOperation.Data.Properties.Title;
        tbDescription.Text = shareOperation.Data.Properties.Description;

        // get Text
        bool bContainText = false;
        shareOperation.Data.Contains(StandardDataFormats.Text, out bContainText);
        if (bContainText)
        {
            tbText.Text = shareOperation.Data.GetText();
        }

        // ....

        // get Image
        bool bContainImage = false;
        shareOperation.Data.Contains(StandardDataFormats.Bitmap, out bContainImage);
        if (bContainImage)
        {
            IRandomAccessStream streamImage = shareOperation.Data.GetBitmap();
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.SetSource(streamImage);
            ivImage.Source = bitmapImage;
        }
        // ....

        // get HTML
        // ....

        tbTitle.Text = shareOperation.Data.Properties.Title;
        tbDescription.Text = shareOperation.Data.Properties.Description;
    }

    Window.Current.Content = this;
    Window.Current.Activate();
}
DataPackage中每一个Set方法都有一个对应的get方法来得到之前打包的数据。

实现这些方法之后,TargetApp的大概功能就已经都实现了,例如分享一张图片:
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
 
TargetApp还有一个QuickLink的概念,在获取打包数据并处理之后,可以返回系统一个QuickLink,代码实现如下:
QuickLink quickLink = new QuickLink
{
    Id = tbQuickLinkIdInput.Text,
    Title = "share to ShareTargetDemo",
    Description = "whatever啦",
    SupportedFileTypes = { ".png", ".wma", ".jpg", ".bmp", ".wmv", ".txt", ".mp3", ".mp4", ".gif", ".docx", ".pptx", ".xlsx", ".pdf" },
    SupportedDataFormats = { "unicodetext", "uniformResourceLocatorW", "bitmap" }
};
StorageFile thumbnailFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.CreateFileAsync(@"images\QuickLink.png", CreationCollisionOption.OpenIfExists);
quickLink.Thumbnail = StreamReference.CreateFromFile(thumbnailFile);

shareOperation.ReportCompleted(quickLink);

之后这支TargetApp就会作为常用Target出现在Share的menu中:
Windows8:基于C的Share Contract实现 - 乂乂 - 一个人,一支烟  ·~~
 
而TargetApp也可以在上面代码的ActivateAsync函数中用shareOperation.QuickLinkId来判断是否是从QuickLink进入到TargetApp的,从而根据不同的QuickLinkId做特别处理。

做了一个界面很简单的Demo,但是ShareContract的方法及功能都包含在内了。
如果有需要请留下邮箱地址,我可以提供完整的代码供参考。

这篇文章也不错http://msdn.microsoft.com/en-us/library/windows/apps/hh465261(v=VS.85).aspx
  评论这张
 
阅读(2316)| 评论(7)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017