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


[源碼下載]


重新想象 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
[源碼下載]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM