zoukankan      html  css  js  c++  java
  • 重新想象 Windows 8.1 Store Apps (84)

    [源码下载]


    重新想象 Windows 8.1 Store Apps (84) - 图像处理的新特性, Share Contract 的新特性



    作者:webabcd


    介绍
    重新想象 Windows 8.1 Store Apps 之图像处理的新特性, Share Contract 的新特性

    • 图像处理的新特性 - 通过 RenderTargetBitmap 对 xaml 截图,以及保存图片
    • Share Contract 的新特性 - 增加 WebLink, ApplicationLink, 去掉了 Uri, “共享目标”可以自己 dismiss



    示例
    1、演示图像处理的新特性
    RenderTargetBitmapDemo.xaml

    <Page
        x:Class="Windows81.Image.RenderTargetBitmapDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows81.Image"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <StackPanel Width="200" Name="root" HorizontalAlignment="Left">
                    <TextBlock Name="lblMsg" FontSize="14.667" Text="i am webabcd" />
                    <Slider Width="200" />
                    <Image Source="/Assets/Son.jpg" />
                </StackPanel>
    
                <Button Name="btnSaveImage" Content="将控件 root 中的内容保存为图片" Click="btnSaveImage_Click" Margin="0 10 0 0" />
                <Image Name="image" Margin="0 10 0 0" Stretch="None" HorizontalAlignment="Left" />
    
            </StackPanel>
        </Grid>
    </Page>

    RenderTargetBitmapDemo.xaml.cs

    /*
     * 演示如何通过 RenderTargetBitmap 对 xaml 截图,以及如何将其保存为图片
     * 
     * 
     * RenderTargetBitmap - 用于对 xaml 截图,以及保存截图(其继承自 ImageSource)
     *     PixelWidth, PixelWidth - 宽和高
     *     RenderAsync() - 对指定的 UIElement 截图
     *     GetPixelsAsync() - 获取图像的二进制数据(Bgra8 格式,关于 Bgra8 格式请参见:http://www.cnblogs.com/webabcd/archive/2013/05/27/3101069.html)
     *     
     * 
     * 
     * 关于更多的图像处理基础,以及 WriteableBitmap 的应用请参见:
     * http://www.cnblogs.com/webabcd/archive/2013/05/27/3101069.html
     */
    
    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.Graphics.Display;
    using Windows.Graphics.Imaging;
    using Windows.Storage;
    using Windows.Storage.Pickers;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media.Imaging;
    
    namespace Windows81.Image
    {
        public sealed partial class RenderTargetBitmapDemo : Page
        {
            public RenderTargetBitmapDemo()
            {
                this.InitializeComponent();
            }
    
            private async void btnSaveImage_Click(object sender, RoutedEventArgs e)
            {
                // 实例化 RenderTargetBitmap 并对指定的 UIElement 截图,同时指定截图的宽和高
                RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
                await renderTargetBitmap.RenderAsync(root, (int)root.ActualWidth, (int)root.ActualHeight);
    
                // 由于 RenderTargetBitmap 继承自 ImageSource,所以可以直接显示(WriteableBitmap 也继承了 ImageSource)
                image.Source = renderTargetBitmap;
    
    
                // 获取截图的像素数据
                var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
    
                // 实例化一个 FileSavePicker 用于保存图片
                var savePicker = new FileSavePicker();
                savePicker.DefaultFileExtension = ".png";
                savePicker.FileTypeChoices.Add(".png", new List<string> { ".png" });
                savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
                savePicker.SuggestedFileName = "snapshot.png";
                var saveFile = await savePicker.PickSaveFileAsync();
                if (saveFile == null)
                    return;
    
                // 对二进制图像数据做 png 编码处理(关于更多的图像处理的示例请参见:http://www.cnblogs.com/webabcd/archive/2013/05/27/3101069.html
                using (var fileStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream);
    
                    encoder.SetPixelData(
                        BitmapPixelFormat.Bgra8,
                        BitmapAlphaMode.Ignore,
                        (uint)renderTargetBitmap.PixelWidth,
                        (uint)renderTargetBitmap.PixelHeight,
                        DisplayInformation.GetForCurrentView().LogicalDpi,
                        DisplayInformation.GetForCurrentView().LogicalDpi,
                        pixelBuffer.ToArray());
    
                    // 保存 png 图片
                    await encoder.FlushAsync();
                }
            }
        }
    }



    2、演示 Share Contract 的新特性
    共享源:
    ShareSource.xaml

    <Page
        x:Class="Windows81.ShareContract.ShareSource"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows81.ShareContract"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <TextBlock Name="lblMsg" FontSize="14.667" />
    
                <Button Content="Share WebLink" Click="Button_Click" Margin="0 10 0 0" />
    
                <Button Content="Share ApplicationLink" Click="Button_Click" Margin="0 10 0 0" />
    
            </StackPanel>
        </Grid>
    </Page>

    ShareSource.xaml.cs

    /*
     * 演示 Share Contract 的新特性(增加 WebLink, ApplicationLink, 去掉了 Uri, “共享目标”可以自己 dismiss)
     * 
     * 
     * 本例为“共享源”
     * 
     * 
     * 注:关于 Share Contract 的基础请参见:http://www.cnblogs.com/webabcd/archive/2013/07/04/3171085.html
     */
    
    using System;
    using Windows.ApplicationModel.DataTransfer;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows81.ShareContract
    {
        public sealed partial class ShareSource : Page
        {
            // 当前需要分享的内容的类型
            private string _shareType = "Share WebLink";
    
            public ShareSource()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                // 初始化 DataTransferManager
                DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
                dataTransferManager.DataRequested += dataTransferManager_DataRequested;
                dataTransferManager.TargetApplicationChosen += dataTransferManager_TargetApplicationChosen;
            }
    
            void dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
            {
                // 共享操作开始时(即弹出共享面板后),根据需要分享的内容的类型执行指定的方法
                switch (_shareType)
                {
                    case "Share WebLink": // win 8.1 新增(一个 web 链接),去掉了原 Uri 共享(即在 win8.1 中将 Uri 拆分为 WebLink 和 ApplicationLink)
                        ShareWebLink(sender, args);
                        break;
                    case "Share ApplicationLink": // win 8.1 新增(一个 app 的自定义协议),去掉了原 Uri 共享(即在 win8.1 中将 Uri 拆分为 WebLink 和 ApplicationLink)
                        ShareApplicationLink(sender, args);
                        break;
                    default:
                        break;
                }
            }
    
            void dataTransferManager_TargetApplicationChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args)
            {
                // 显示用户需要与其共享内容的应用程序的名称
                lblMsg.Text = "共享给:" + args.ApplicationName;
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                _shareType = (sender as Button).Content.ToString();
    
                // 弹出共享面板,以开始共享操作
                DataTransferManager.ShowShareUI();
            }
    
            // 共享 WebLink 的 Demo
            private void ShareWebLink(DataTransferManager dtm, DataRequestedEventArgs args)
            {
                // 设置用于共享给“共享目标”的一些信息
                DataPackage dataPackage = args.Request.Data;
                dataPackage.Properties.Title = "Title";
                dataPackage.Properties.Description = "Description";
                // dataPackage.Properties.ApplicationListingUri - app 在商店中的 uri
                // dataPackage.Properties.ApplicationName
    
                // dataPackage.Properties.PackageFamilyName - win8.1 新增
                // dataPackage.Properties.LogoBackgroundColor - win8.1 新增,app 的 Square30x30Logo 图标的背景色(图标在“共享目标”的右上角显示)
                // dataPackage.Properties.ContentSourceWebLink - win8.1 新增
                // dataPackage.Properties.ContentSourceApplicationLink - win8.1 新增
    
                dataPackage.SetWebLink(new Uri("http://webabcd.cnblogs.com"));
            }
    
            // 共享 ApplicationLink 的 Demo
            private void ShareApplicationLink(DataTransferManager dtm, DataRequestedEventArgs args)
            {
                // 设置用于共享给“共享目标”的一些信息
                DataPackage dataPackage = args.Request.Data;
                dataPackage.Properties.Title = "Title";
                dataPackage.Properties.Description = "Description";
                // dataPackage.Properties.ApplicationListingUri - app 在商店中的 uri
                // dataPackage.Properties.ApplicationName
    
                // dataPackage.Properties.PackageFamilyName - win8.1 新增
                // dataPackage.Properties.LogoBackgroundColor - win8.1 新增,app 的 Square30x30Logo 图标的背景色(图标在“共享目标”的右上角显示)
                // dataPackage.Properties.ContentSourceWebLink - win8.1 新增
                // dataPackage.Properties.ContentSourceApplicationLink - win8.1 新增
    
                dataPackage.SetApplicationLink(new Uri("webabcd:webabcd.cnblogs.com"));
            }
        }
    }


    共享目标:
    ShareTarget.xaml

    <Page
        x:Class="Windows81.ShareContract.ShareTarget"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows81.ShareContract"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="120 0 0 0">
    
                <TextBlock Name="lblMsg" FontSize="14.667" Margin="0 10 0 0" />
                
                <Button Name="btnDismiss" Content="dismiss" Click="btnDismiss_Click" Margin="0 10 0 0" />
    
            </StackPanel>
        </Grid>
    </Page>

    ShareTarget.xaml.cs

    /*
     * 演示 Share Contract 的新特性(增加 WebLink, ApplicationLink, 去掉了 Uri, “共享目标”可以自己 dismiss)
     * 
     * 
     * 本例为“共享目标”
     * 1、请在 manifest 中增加相应的声明,并增加共享“WebLink”和“ApplicationLink”的数据格式
     * 
     * 
     * 注:关于 Share Contract 的基础请参见:http://www.cnblogs.com/webabcd/archive/2013/07/04/3171085.html
     */
    
    using System;
    using System.Threading.Tasks;
    using Windows.ApplicationModel.Activation;
    using Windows.ApplicationModel.DataTransfer;
    using Windows.ApplicationModel.DataTransfer.ShareTarget;
    using Windows.UI.Core;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows81.ShareContract
    {
        public sealed partial class ShareTarget : Page
        {
            private ShareOperation _shareOperation;
    
            public ShareTarget()
            {
                this.InitializeComponent();
            }
    
            protected async override void OnNavigatedTo(NavigationEventArgs e)
            {
                // 获取 ShareOperation 对象
                ShareTargetActivatedEventArgs shareTargetActivated = (ShareTargetActivatedEventArgs)e.Parameter;
                if (shareTargetActivated == null)
                {
                    lblMsg.Text = "为了演示共享目标,请从共享源激活本页面";
                    return;
                }
                _shareOperation = shareTargetActivated.ShareOperation;
    
                // 异步获取共享数据
                await Task.Factory.StartNew(async () =>
                {
                    // 如果共享数据中包含 WebLink 格式数据,则显示之
                    if (_shareOperation.Data.Contains(StandardDataFormats.WebLink))
                    {
                        try
                        {
                            var uri = await _shareOperation.Data.GetWebLinkAsync();
                            OutputMessage("WebLink: " + uri.AbsoluteUri);
                        }
                        catch (Exception ex)
                        {
                            OutputMessage(ex.ToString());
                        }
                    }
                    // 如果共享数据中包含 ApplicationLink 格式数据,则显示之
                    if (_shareOperation.Data.Contains(StandardDataFormats.ApplicationLink))
                    {
                        try
                        {
                            var uri = await _shareOperation.Data.GetApplicationLinkAsync();
                            OutputMessage("ApplicationLink: " + uri.AbsoluteUri);
                        }
                        catch (Exception ex)
                        {
                            OutputMessage(ex.ToString());
                        }
                    }
    
                    // 获取“共享源”传递过来的信息
                    OutputMessage("ContentSourceApplicationLink: " + _shareOperation.Data.Properties.ContentSourceApplicationLink); // win 8.1 新增
                    OutputMessage("ContentSourceWebLink: " + _shareOperation.Data.Properties.ContentSourceWebLink); // win 8.1 新增
                    OutputMessage("PackageFamilyName: " + _shareOperation.Data.Properties.PackageFamilyName); // win 8.1 新增
                    OutputMessage("LogoBackgroundColor: " + _shareOperation.Data.Properties.LogoBackgroundColor); // win 8.1 新增
                    OutputMessage("ApplicationListingUri: " + _shareOperation.Data.Properties.ApplicationListingUri);
                    OutputMessage("ApplicationName: " + _shareOperation.Data.Properties.ApplicationName);
                });
            }
    
            // 在 UI 上输出指定的信息
            async private void OutputMessage(string message)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text += message;
                    lblMsg.Text += Environment.NewLine;
                });
            }
    
            private void btnDismiss_Click(object sender, RoutedEventArgs e)
            {
                // ShareOperation.DismissUI() - win8.1 中新增,用于 dismiss 掉当前的“共享目标”
                _shareOperation.DismissUI();
            }
        }
    }
    
    /*
     * 为了激活“共享目标”,需要在 App.xaml.cs 中 override 如下方法
    
    // 通过共享激活应用程序时所调用的方法
    protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
    {
        var rootFrame = new Frame();
        rootFrame.Navigate(typeof(Windows81.ShareContract.ShareTarget), args);
        Window.Current.Content = rootFrame;
    
        Window.Current.Activate();
    }
    */



    OK
    [源码下载]

  • 相关阅读:
    嵌入式Linux的启动过程
    【转载】vim 中文帮助手册的安装
    面向对象之编写驱动程序--中断(linux系统、s3c6410开发板)
    【转】DBCC IND / DBCC PAGE
    【转】索引查询 sys.dm_db_index_physical_stats
    【tag】Enum.HasFlag 方法
    【tag】Tuple 类 使用介绍
    【fixed point】柯里化(currying) C#实现
    SqlDataAdapter 批量更新 DataTable
    sqlCacheDependency 使用
  • 原文地址:https://www.cnblogs.com/webabcd/p/3850153.html
Copyright © 2011-2022 走看看