新时尚Windows8开发(11):共享目标示例

来源:互联网 发布:淘宝卖家旺旺名是什么 编辑:程序博客网 时间:2024/06/10 20:02

老周的博客http://blog.csdn.net/tcjiaan,转载请注明原作者和出处。

 

上一篇文章中,我们吹了一下共享数据的问题,后面还简单弄了一个例子,本文我们再做一个综合一些的例子,咱们做一个全能共享目标,该目标应用可以接收各种格式的数居。

先来认识一个类,该类可以告诉我们标准数据有哪些——StandardDataFormats,这是一个静态类,位于Windows.ApplicationModel.DataTransfer下,意味着,它的所有成员都是静态的,看下图。

它的一系列静成员已经告诉我们六种标准数据格式,相信不用介绍了,看名字就知道了。StorageItems一般指存储在计算机中的文件。

 

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

情景1:启动Bing应用,搜索一些图片,选择其中一张,然后把鼠标移到屏幕的右上角或右下角,待出现侧边栏后选择“共享”。

 

 

 

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

 

 

 

 

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

 

 

 

 

实现步骤如下:

1、启动VS,新建一个项目,此处省略45个字。

2、打开清单文件Package.appxmanifest,切换到“声明”,在列表中选择“共享目标”,单击“添加”按钮。

 

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

 

 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获取。

 

 

好了,就这样。88

 

原创粉丝点击