Welcome

首页 / 软件开发 / .NET编程技术 / Windows 8 Store Apps学习(40) 剪切板操作

Windows 8 Store Apps学习(40) 剪切板操作2013-12-06剪切板: 复制/粘贴文本, html, 图片, 文件

介绍

重新想象 Windows 8 Store Apps 之 剪切板

Clipboard - 剪切板

复制/粘贴文本

复制/粘贴html

复制/粘贴图片

复制/粘贴文件

示例

1、演示剪切板的基本应用

Clipboard/Demo.xaml

<Pagex:Class="XamlDemo.Clipboard.Demo"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:XamlDemo.Clipboard"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 Name="btnCopyText" Content="复制一段文本到剪切板" Click="btnCopyText_Click_1" Margin="0 10 0 0" /><Button Name="btnPasteText" Content="粘贴剪切板中的文本" Click="btnPasteText_Click_1" Margin="0 10 0 0" /><Button Name="btnShowAvailableFormats" Content="获取剪切板中包含的数据的格式类型" Click="btnShowAvailableFormats_Click_1" Margin="0 10 0 0" /><Button Name="btnClear" Content="清除剪切板中的全部内容" Click="btnClear_Click_1" Margin="0 10 0 0" /></StackPanel></Grid></Page>
Clipboard/Demo.xaml.cs

/* * Clipboard - 剪切板 * SetContent() - 将指定的 DataPackage 存入剪切板 * GetContent() - 从剪切板中获取 DataPackage 对象 * Clear() - 清除剪切板中的全部数据 * Flush() - 正常情况下,关闭 app 后,此 app 保存到剪切板的数据就会消失;调用此方法后,即使关闭 app,剪切板中的数据也不会消失 * ContentChanged - 剪切板中的数据发生变化时所触发的事件 ** DataPackage - 用于封装 Clipboard 或 ShareContract 的数据(详细说明见 ShareContract 的 Demo) * SetText(), SetUri(), SetHtmlFormat(), SetRtf(), SetBitmap(), SetStorageItems(), SetData(), SetDataProvider() - 设置复制到剪切板的各种格式的数据(注:一个 DataPackage 可以有多种不同格式的数据) * RequestedOperation - 操作类型(DataPackageOperation 枚举: None, Copy, Move, Link),没发现此属性有任何作用 ** DataPackageView - DataPackage 对象的只读版本,从剪切板获取数据或者共享目标接收数据均通过此对象来获取 DataPackage 对象的数据(详细说明见 ShareContract 的 Demo) */using System;using Windows.ApplicationModel.DataTransfer;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Navigation;namespace XamlDemo.Clipboard{public sealed partial class Demo : Page{public Demo(){this.InitializeComponent();}protected override void OnNavigatedTo(NavigationEventArgs e){Windows.ApplicationModel.DataTransfer.Clipboard.ContentChanged += Clipboard_ContentChanged;}protected override void OnNavigatedFrom(NavigationEventArgs e){Windows.ApplicationModel.DataTransfer.Clipboard.ContentChanged -= Clipboard_ContentChanged;}void Clipboard_ContentChanged(object sender, object e){lblMsg.Text += Environment.NewLine;lblMsg.Text += "剪切板中的内容发生了变化";}// 复制一段文本到剪切板private void btnCopyText_Click_1(object sender, RoutedEventArgs e){// 构造保存到剪切板的 DataPackage 对象DataPackage dataPackage = new DataPackage();dataPackage.SetText("I am webabcd: " + DateTime.Now.ToString());try{Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage); // 保存 DataPackage 对象到剪切板Windows.ApplicationModel.DataTransfer.Clipboard.Flush(); // 当此 app 关闭后,依然保留剪切板中的数据lblMsg.Text = "已将内容复制到剪切板";}catch (Exception ex){lblMsg.Text = ex.ToString();}}// 显示剪切板中的文本数据private async void btnPasteText_Click_1(object sender, RoutedEventArgs e){// 获取剪切板中的数据DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();// 如果剪切板中有文本数据,则获取并显示该文本if (dataPackageView.Contains(StandardDataFormats.Text)){try{string text = await dataPackageView.GetTextAsync();lblMsg.Text = text;}catch (Exception ex){lblMsg.Text = ex.ToString();}}else{lblMsg.Text = "剪切板中无文本内容";}}// 显示剪切板中包含的数据的格式类型,可能会有 StandardDataFormats 枚举的格式,也可能会有自定义的格式(关于自定义格式可以参见:ShareContract 的 Demo)private void btnShowAvailableFormats_Click_1(object sender, RoutedEventArgs e){DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();if (dataPackageView != null && dataPackageView.AvailableFormats.Count > 0){var availableFormats = dataPackageView.AvailableFormats.GetEnumerator();while (availableFormats.MoveNext()){lblMsg.Text += Environment.NewLine;lblMsg.Text += availableFormats.Current;}}else{lblMsg.Text = "剪切板中无任何内容";}}// 清除剪切板中的全部数据private void btnClear_Click_1(object sender, RoutedEventArgs e){Windows.ApplicationModel.DataTransfer.Clipboard.Clear();}}}
2、演示如何复制 html 数据到剪切板,以及如何从剪切板中获取 html 数据

Clipboard/CopyHtml.xaml

<Pagex:Class="XamlDemo.Clipboard.CopyHtml"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:XamlDemo.Clipboard"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 Name="btnCopyHtml" Content="复制一段 html 到剪切板" Click="btnCopyHtml_Click_1" Margin="0 10 0 0" /><Button Name="btnPasteHtml" Content="粘贴剪切板中的 html" Click="btnPasteHtml_Click_1" Margin="0 10 0 0" /></StackPanel></Grid></Page>
Clipboard/CopyHtml.xaml.cs

/* * 演示如何复制 html 数据到剪切板,以及如何从剪切板中获取 html 数据** HtmlFormatHelper - 在 Clipboard 中传递 html 数据或在 ShareContract 中传递 html 数据时的帮助类 * CreateHtmlFormat() - 封装需要传递的 html 字符串,以便以 html 方式传递数据 * GetStaticFragment() - 解封装传递过来的经过封装的 html 数据,从而获取初始需要传递的 html 字符串 */using System;using Windows.ApplicationModel.DataTransfer;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;namespace XamlDemo.Clipboard{public sealed partial class CopyHtml : Page{public CopyHtml(){this.InitializeComponent();}// 复制 html 字符串到剪切板private void btnCopyHtml_Click_1(object sender, RoutedEventArgs e){DataPackage dataPackage = new DataPackage();// 封装一下需要复制的 html 数据,以便以 html 的方式将数据复制到剪切板string htmlFormat = HtmlFormatHelper.CreateHtmlFormat("<body>I am webabcd</body>");dataPackage.SetHtmlFormat(htmlFormat);try{Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage);lblMsg.Text = "已将内容复制到剪切板";}catch (Exception ex){lblMsg.Text = ex.ToString();}}// 显示剪切板中的 html 数据private async void btnPasteHtml_Click_1(object sender, RoutedEventArgs e){DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();if (dataPackageView.Contains(StandardDataFormats.Html)){try{// 封装后的数据string htmlFormat = await dataPackageView.GetHtmlFormatAsync();// 封装前的数据string htmlFragment = HtmlFormatHelper.GetStaticFragment(htmlFormat);lblMsg.Text = "htmlFormat(封装后的数据): ";lblMsg.Text += Environment.NewLine;lblMsg.Text += htmlFormat;lblMsg.Text += Environment.NewLine;lblMsg.Text += Environment.NewLine;lblMsg.Text += "htmlFragment(封装前的数据): ";lblMsg.Text += Environment.NewLine;lblMsg.Text += htmlFragment;}catch (Exception ex){lblMsg.Text = ex.ToString();}}else{lblMsg.Text = "剪切板中无 html 内容";}}}}