win8开发(11)——共享目标示例

上一篇文章中,我们吹了一下共享数据的问题,后面还简单弄了一个例子,本文我们再做一个综合

一些的例子,咱们做一个全能共享目标,该目标应用可以接收各种格式的数居。

先来认识一个类,该类可以告诉我们标准数据有哪些——StandardDataFormats,这是一个静态类,

位于Windows.ApplicationModel.DataTransfer下,意味着,它的所有成员都是静态的,看下图。

1.png 



它的一系列静成员已经告诉我们六种标准数据格式,相信不用介绍了,看名字就知道了。

StorageItems一般指存储在计算机中的文件。


本例启用了五种格式的协定(除rtf外),可以接受多种共享数据,先看看运行的结果。

情景1:启动Bing应用,搜索一些图片,选择其中一张,然后把鼠标移到屏幕的右上角或右下角,

待出现侧边栏后选择“共享”。

2.png 

3.png 

4.png 

情景2:打开浏览器,随便打开一个页面。可获取到页面的URI。

5.png 

6.png 

7.png 


情景3:打开“网易云阅读”应用,随便打开一篇文章,然后共享,得到共享字符串。

8.png 

9.png 



11.png 

实现步骤如下:
1、启动VS,新建一个项目,此处省略45个字。
2、打开清单文件Package.appxmanifest,切换到“声明”,在列表中选择“共享目标”,单击“添加”按钮。

12.png 

在右边的框架中,添加五个数据格式的支持。


13.png 
3、打开MainPage.xaml,输入以下XAML
<Page
    x:Class="MyApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Canvas Name="cvText" Visibility="Collapsed">
            <TextBox Name="txtText" Canvas.Left="24" Canvas.Top="12" Width="860" Height="450" TextWrapping="Wrap"/>
        </Canvas>
        
        <Canvas Name="cvBitmap" Visibility="Collapsed">
            <Image Name="img" Canvas.Top="20" Canvas.Left="24" Stretch="Uniform" Width="900"/>
        </Canvas>
        
        <TextBlock Name="tbFomats" VerticalAlignment="Bottom" HorizontalAlignment="Left"
                   FontSize="24"
                   Canvas.ZIndex="10" TextWrapping="Wrap"/>
    </Grid>
</Page>
4、打开MainPage.xaml.cs,为App类重写OnShareTargetActivated,为了好看,就另外定义一个部分类。
    public sealed partial class App : Application
    {
        protected override void OnShareTargetActivated(Windows.ApplicationModel.Activation.ShareTargetActivatedEventArgs args)
        {
            ShareOperation op = args.ShareOperation;
            Frame root = Window.Current.Content as Frame;
            if (root == null)
            {
                root = new Frame();
                root.Navigate(typeof(MainPage), op);
            }
            Window.Current.Content = root;
            Window.Current.Activate();
        }
    }
5、MainPage.xaml.cs剩下的代码如下
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.DataTransfer.ShareTarget;
using Windows.Storage;
using Windows.Storage.Streams;


namespace MyApp
{
    /// <summary>
    /// 可用于自身或导航至 Frame 内部的空白页。
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (e.Parameter is ShareOperation)
            {
                ShareOperation op = (ShareOperation)e.Parameter;
                DataPackageView pv = op.Data;
                // 显示包含格式
                IReadOnlyList<string> listFormats = pv.AvailableFormats;
                string formatsStr = string.Join("\t", listFormats.ToArray());
                tbFomats.Text = formatsStr;

                // 根据获取到不同的数据格式做相应处理
                if (pv.Contains(StandardDataFormats.Bitmap))
                {
                    RandomAccessStreamReference strRef = await pv.GetBitmapAsync();
                    IRandomAccessStreamWithContentType stream = await strRef.OpenReadAsync();
                    // 读出图片
                    Windows.UI.Xaml.Media.Imaging.BitmapImage bmp=new Windows.UI.Xaml.Media.Imaging.BitmapImage();
                    bmp.SetSource(stream);
                    this.img.Source=bmp;
                    cvText.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                    cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
                else if (pv.Contains(StandardDataFormats.Text))
                {
                    string value = await pv.GetTextAsync();
                    txtText.Text = value;
                    cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                    cvText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
                else if (pv.Contains(StandardDataFormats.Uri))
                {
                    Uri xuri = await pv.GetUriAsync();
                    txtText.Text = xuri.ToString();
                    cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                    cvText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
                else if (pv.Contains(StandardDataFormats.Html))
                {
                    string html = HtmlFormatHelper.GetStaticFragment(await pv.GetHtmlFormatAsync());
                    txtText.Text = html;
                    cvText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                    cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                }
                else if (pv.Contains(StandardDataFormats.StorageItems))
                {
                    IReadOnlyList<IStorageItem> items = await pv.GetStorageItemsAsync();
                    string files = string.Empty;
                    foreach (var item in items)
                    {
                        files += item.Name + "\n";
                    }
                    txtText.Text = files;
                    cvBitmap.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                    cvText.Visibility = Windows.UI.Xaml.Visibility.Visible;
                }
            }
        }
    }
上面代码中,把ShareOperation作为导航的参数传递给主页面,在MainPage中的OnNavigatedTo获取。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值