[源码下载]

重新想象 Windows 8 Store Apps (39) - 契约: Share Contract

作者:webabcd

介绍
重新想象 Windows 8 Store Apps 之 契约

  • Share Contract - 右侧边栏称之为 Charm,其中的“共享”称之为 Share Contract

示例
1、演示如何开发共享源
Contracts/ShareContract/ShareSource.xaml

<Page
x:Class="XamlDemo.Contracts.ShareContract.ShareSource"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Contracts.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 Text" Click="Button_Click_1" Margin="0 10 0 0" /> <Button Content="Share Link" Click="Button_Click_1" Margin="0 10 0 0" /> <Button Content="Share Image" Click="Button_Click_1" Margin="0 10 0 0" /> <Button Content="Share File" Click="Button_Click_1" Margin="0 10 0 0" /> <Button Content="Share Html" Click="Button_Click_1" Margin="0 10 0 0" /> <Button Content="Share Custom Data" Click="Button_Click_1" Margin="0 10 0 0" /> <Button Content="Share With Deferral" Click="Button_Click_1" Margin="0 10 0 0" /> </StackPanel>
</Grid>
</Page>

Contracts/ShareContract/ShareSource.xaml.cs

/*
* Share Contract - 右侧边栏称之为 Charm,其中的“共享”称之为 Share Contract
*
* 本例演示如何开发共享源
* 共享源 - 提供共享数据的 app
* 共享目标 - 接收并处理共享数据的 app
* 共享面板 - 点击“共享”后出来的,包含了一堆共享目标的面板
*
* DataTransferManager - 共享数据管理器
* GetForCurrentView() - 返回当前窗口关联的 DataTransferManager 对象
* ShowShareUI() - 弹出共享面板,以开始共享操作
* DataRequested - 共享操作开始时(即弹出共享面板后)所触发的事件,事件参数为 DataTransferManager 和 DataRequestedEventArgs
* TargetApplicationChosen - 选中了共享面板上的某个共享目标时所触发的事件,事件参数为 DataTransferManager 和 TargetApplicationChosenEventArgs
*
* TargetApplicationChosenEventArgs - TargetApplicationChosen 的事件参数
* ApplicationName - 选中的共享目标的名称
*
* DataRequestedEventArgs - DataRequested 的事件参数
* Request - 返回 DataRequest 类型的数据
*
* DataRequest - 一个对象,其包括了共享的内容和错误提示
* FailWithDisplayText() - 指定当共享操作失败时,需要在共享面板上显示的提示信息
* Data - 需要共享的内容,返回 DataPackage 对象
*
* DataPackage - 共享内容(注:复制到剪切板的内容也是通过此对象来封装)
* Properties - 返回 DataPackagePropertySetView 对象
* Properties.Title - 共享数据的标题
* Properties.Description - 共享数据的描述
* Properties.Thumbnail - 共享数据的缩略图
* Properties.FileTypes - 获取共享数据中包含的文件类型
* SetText(), SetUri(), SetHtmlFormat(), SetRtf(), SetBitmap(), SetStorageItems(), SetData(), SetDataProvider() - 设置需要共享的各种格式的数据,详细用法见下面的相关 demo(注:一个 DataPackage 可以有多种不同格式的数据)
* ResourceMap - IDictionary<string, RandomAccessStreamReference> 类型,共享 html 时如果其中包含了本地资源的引用(如引用了本地图片),则需要通过 ResourceMap 传递
* GetView() - 返回 DataPackageView 对象,其相当于 DataPackage 的一个只读副本,详细说明见 ShareTarget.xaml.cs
* 另:WebView.DataTransferPackage 会返回用户选中的内容的 DataPackage 对象,以便分享浏览器内的 html 内容
*
* 异步共享:
* 1、DataPackage 通过 SetDataProvider() 传递数据,其对应的委托的参数为一个 DataProviderRequest 类型的数据
* 2、DataProviderRequest.GetDeferral() 用于获取 DataProviderDeferral 对象以开始异步处理,然后通过 DataProviderDeferral.Complete() 通知 DataPackage 已经完成了异步操作
*/ using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using System.Linq;
using Windows.Graphics.Imaging; namespace XamlDemo.Contracts.ShareContract
{
public sealed partial class ShareSource : Page
{
// 当前需要分享的内容的类型
private string _shareType = "Share Text";
// 需要分享的文件集合
private IReadOnlyList<StorageFile> _selectedFiles; 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 Text":
ShareText(sender, args);
break;
case "Share Link":
ShareLink(sender, args);
break;
case "Share Image":
ShareImage(sender, args);
break;
case "Share File":
ShareFile(sender, args);
break;
case "Share With Deferral":
ShareWithDeferral(sender, args);
break;
case "Share Html":
ShareHtml(sender, args);
break;
case "Share Custom Data":
ShareCustomData(sender, args);
break;
default:
break;
} // 共享操作失败时,在共享面板上显示的提示信息
// args.Request.FailWithDisplayText("共享操作失败");
} void dataTransferManager_TargetApplicationChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args)
{
// 显示用户需要与其共享内容的应用程序的名称
lblMsg.Text = "共享给:" + args.ApplicationName;
} private async void Button_Click_1(object sender, RoutedEventArgs e)
{
_shareType = (sender as Button).Content.ToString(); // 如果需要共享文件,则提示用户选择文件
if (_shareType == "Share Image" || _shareType == "Share File" || _shareType == "Share With Deferral")
{
bool unsnapped = ((ApplicationView.Value != ApplicationViewState.Snapped) || ApplicationView.TryUnsnap());
if (unsnapped)
{
FileOpenPicker filePicker = new FileOpenPicker
{
ViewMode = PickerViewMode.List,
SuggestedStartLocation = PickerLocationId.PicturesLibrary,
FileTypeFilter = { "*" }
// FileTypeFilter = { ".jpg", ".png", ".bmp", ".gif", ".tif" }
}; _selectedFiles = await filePicker.PickMultipleFilesAsync();
if (_selectedFiles.Count > )
{
// 弹出共享面板,以开始共享操作
DataTransferManager.ShowShareUI();
}
}
}
else
{
// 弹出共享面板,以开始共享操作
DataTransferManager.ShowShareUI();
}
} // 共享文本的 Demo
private void ShareText(DataTransferManager dtm, DataRequestedEventArgs args)
{
DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description";
dataPackage.SetText("需要分享的详细内容");
} // 共享超链的 Demo
private void ShareLink(DataTransferManager dtm, DataRequestedEventArgs args)
{
DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description";
dataPackage.SetUri(new Uri("http://webabcd.cnblogs.com"));
} // 共享图片的 Demo(关于如何为分享的图片减肥请参见本例的“异步共享的 Demo”)
private void ShareImage(DataTransferManager dtm, DataRequestedEventArgs args)
{
DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description"; // 分享选中的所有文件中的第一个文件(假设其是图片)
RandomAccessStreamReference imageStreamRef = RandomAccessStreamReference.CreateFromFile(_selectedFiles.First());
dataPackage.Properties.Thumbnail = imageStreamRef;
dataPackage.SetBitmap(imageStreamRef);
} // 共享文件的 Demo
private void ShareFile(DataTransferManager dtm, DataRequestedEventArgs args)
{
DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description";
dataPackage.SetStorageItems(_selectedFiles);
} // 共享 html 的 Demo
private void ShareHtml(DataTransferManager dtm, DataRequestedEventArgs args)
{
string localImage = "ms-appx:///Assets/Logo.png";
string htmlExample = "<p><b>webabcd</b><img src=\"" + localImage + "\" /></p>";
// 为 html 添加共享所需的必要的标头,以保证可以正常进行 html 的共享操作
string htmlFormat = HtmlFormatHelper.CreateHtmlFormat(htmlExample); DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description";
dataPackage.SetHtmlFormat(htmlFormat); // 设置本地图像数据(如果需要共享的 html 包含本地图像,则只能通过这种方法共享之)
RandomAccessStreamReference streamRef = RandomAccessStreamReference.CreateFromUri(new Uri(localImage));
dataPackage.ResourceMap[localImage] = streamRef; /*
* 以下演示如何共享 WebView 中的被用户选中的 html
* 具体可参见:Controls/WebView/Share.xaml
*
DataPackage dataPackage = WebView.DataTransferPackage;
DataPackageView dataPackageView = dataPackage.GetView(); if ((dataPackageView != null) && (dataPackageView.AvailableFormats.Count > 0))
{
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description"; args.Request.Data = dataPackage;
}
*/
} // 共享自定义数据的 Demo
private void ShareCustomData(DataTransferManager dtm, DataRequestedEventArgs args)
{
DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description"; // 指定需要分享的自定义数据,第一个参数是自定义数据的格式 id(注:标准格式 id 在 Windows.ApplicationModel.DataTransfer.StandardDataFormats 枚举)
// 要让自定义数据可以正常分享,需要在 Package.appxmanifest 中的“共享目标”声明中对自定义格式 id 做相应的配置,以及在 SourceTarget 对自定义格式 id 做相应的处理
dataPackage.SetData("http://webabcd/sharedemo", "自定义数据");
} // 异步共享的 Demo(在共享内容需要较长时间才能计算出来的场景下,应该使用异步共享)
private void ShareWithDeferral(DataTransferManager dtm, DataRequestedEventArgs args)
{
DataPackage dataPackage = args.Request.Data;
dataPackage.Properties.Title = "Title";
dataPackage.Properties.Description = "Description"; dataPackage.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(_selectedFiles.First());
// 通过委托来提供共享数据,当用户点击了共享目标后会调用此委托,即不马上提供共享数据,而是等到用户点击了共享目标后再异步准备数据
dataPackage.SetDataProvider(StandardDataFormats.Bitmap, providerRequest => this.OnDeferredImageRequestedHandler(providerRequest, _selectedFiles.First()));
} // 用户点击了共享目标后会调用此方法
private async void OnDeferredImageRequestedHandler(DataProviderRequest providerRequest, StorageFile imageFile)
{
// 获取 DataProviderDeferral,以开始异步处理,即在此之后允许调用 await 方法
DataProviderDeferral deferral = providerRequest.GetDeferral();
InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream(); try
{
// 将用户选中的图片缩小一倍,然后再共享
IRandomAccessStream imageStream = await imageFile.OpenAsync(FileAccessMode.Read);
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream);
BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
await imageEncoder.FlushAsync(); // 停 3 秒,以模拟长时间任务
await Task.Delay(); providerRequest.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
}
finally
{
// 通知 DataPackage 已经完成了共享数据的准备
deferral.Complete();
}
}
}
}

2、演示如何开发共享目标
Contracts/ShareContract/ShareTarget.xaml

<Page
x:Class="XamlDemo.Contracts.ShareContract.ShareTarget"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Contracts.ShareContract"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="#438bdf"> <ScrollViewer Name="scrollView" Margin="120 0 0 0">
<StackPanel>
<TextBlock Name="lblMsg" FontSize="14.667" /> <Image Name="imgThumbnail" Margin="0 10 0 0" /> <Image Name="imgBitmap" Margin="0 10 0 0" /> <Button Content="新增一个 QuickLink,并完成共享操作" Click="Button_Click_1" Margin="0 10 0 0" />
</StackPanel>
</ScrollViewer> </Grid>
</Page>

Contracts/ShareContract/ShareTarget.xaml.cs

/*
* Share Contract - 右侧边栏称之为 Charm,其中的“共享”称之为 Share Contract
*
* 本例演示如何开发共享目标
* 1、在 Package.appxmanifest 中新增一个“共享目标”声明,并做相关配置
* 2、在 App.xaml.cs 中 override void OnShareTargetActivated(ShareTargetActivatedEventArgs args),以获取相关的共享信息
*
* ShareTargetActivatedEventArgs - 当 app 由共享激活时的事件参数
* ShareOperation - 返回一个 ShareOperation 类型的对象
* PreviousExecutionState - 此 app 被共享激活前的执行状态(ApplicationExecutionState 枚举:NotRunning, Running, Suspended, Terminated, ClosedByUser)
* SplashScreen - 启动画面对象
*
* ShareOperation - 共享操作的相关信息
* Data - 返回 DataPackageView 对象,其相当于 DataPackage 的一个只读副本
* QuickLinkId - 如果是 QuickLink 激活的,此属性可获取此 QuickLink 的 Id
* RemoveThisQuickLink() - 如果是 QuickLink 激活的,此方法可删除此 QuickLink
* ReportCompleted() - 通知系统共享操作已经完成(会自动关闭共享面板),需要的话可以指定一个需要增加的 QuickLink 对象
* ReportStarted(), ReportDataRetrieved(), ReportError(), ReportSubmittedBackgroundTask() - 顾名思义的一些方法,用不用皆可,它们的作用是可以帮助系统优化资源的使用
*
* DataPackage 对象的只读版本,从剪切板获取数据或者共享目标接收数据均通过此对象来获取 DataPackage 对象的数据
* AvailableFormats - DataPackage 中数据所包含的所有格式
* Contains() - 是否包含指定格式的数据
* Properties - 返回 DataPackagePropertySetView 对象,就是由共享源所设置的一些信息,参见 ShareSource.xaml.cs
* GetTextAsync(), GetUriAsync(), GetRtfAsync(), GetHtmlFormatAsync(), GetBitmapAsync(), GetStorageItemsAsync(), GetDataAsync(), GetResourceMapAsync() - 获取共享过来的各种格式的数据,详细用法见下面的相关 demo(注:一个 DataPackage 可以有多种不同格式的数据)
*
* QuickLink - 预定义了一些数据,指向相应共享目标的一个快捷方式,其会出现在共享面板的上部
* Id - 预定义数据
* Title - QuickLink 出现在共享面板上的时候所显示的名称
* Thumbnail - QuickLink 出现在共享面板上的时候所显示的图标
* SupportedDataFormats - 共享数据中所包含的数据格式与 SupportedDataFormats 定义的相匹配(两个集合中的元素有一个匹配即可),QuickLink 才会出现在共享面板上
* SupportedFileTypes - 共享数据中所包含的文件的扩展名与 SupportedDataFormats 定义的相匹配(两个集合中的元素有一个匹配即可),QuickLink 才会出现在共享面板上
*
* QuickLink 的适用场景举例
* 1、当用户总是共享信息到某一个邮件地址时,便可以此邮件地址为 QuickLinkId 生成一个 QuickLink
* 2、下回用户再想共享信息到此邮件地址时,就可点此 QuickLink 来启动共享操作
* 3、共享目标被 QuickLink 激活后便可以解析 QuickLink 中的 Id,即用户需要共享到的邮件地址,从而避免用户输入此邮件地址,从而方便用户的共享操作
*/ using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.DataTransfer.ShareTarget;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Core;
using Windows.UI.Popups;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Navigation; namespace XamlDemo.Contracts.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 () =>
{
// 显示共享数据中相关信息
OutputMessage("QuickLinkId: " + _shareOperation.QuickLinkId);
OutputMessage("Title: " + _shareOperation.Data.Properties.Title);
OutputMessage("Description: " + _shareOperation.Data.Properties.Description);
ShowThumbnail(_shareOperation.Data.Properties.Thumbnail); // 如果共享数据中包含 Text 格式数据,则显示之
if (_shareOperation.Data.Contains(StandardDataFormats.Text))
{
try
{
var text = await _shareOperation.Data.GetTextAsync();
OutputMessage("Text: " + text);
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
// 如果共享数据中包含 Uri 格式数据,则显示之
if (_shareOperation.Data.Contains(StandardDataFormats.Uri))
{
try
{
var uri = await _shareOperation.Data.GetUriAsync();
OutputMessage("Uri: " + uri.AbsoluteUri);
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
// 如果共享数据中包含 Bitmap 格式数据,则显示之
if (_shareOperation.Data.Contains(StandardDataFormats.Bitmap))
{
try
{
IRandomAccessStreamReference stream = await _shareOperation.Data.GetBitmapAsync();
ShowBitmap(stream);
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
// 如果共享数据中包含 Html 格式数据,则显示之
if (_shareOperation.Data.Contains(StandardDataFormats.Html))
{
try
{
// 获取 html 数据
var html = await _shareOperation.Data.GetHtmlFormatAsync();
OutputMessage("Html: " + html); // 获取 html 中包含的本地资源的引用(如引用的本地图片等),其数据在分享源的 DataPackage.ResourceMap 中设置
IReadOnlyDictionary<string, RandomAccessStreamReference> sharedResourceMap = await _shareOperation.Data.GetResourceMapAsync();
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
// 如果共享数据中包含 StorageItems 格式数据,则显示之
if (_shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
try
{
var storageItems = await _shareOperation.Data.GetStorageItemsAsync();
foreach (var storageItem in storageItems)
{
OutputMessage("storageItem: " + storageItem.Path);
}
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
// 如果共享数据中包含“http://webabcd/sharedemo”格式数据,则显示之
if (_shareOperation.Data.Contains("http://webabcd/sharedemo"))
{
try
{
var customData = await _shareOperation.Data.GetTextAsync("http://webabcd/sharedemo");
OutputMessage("Custom Data: " + customData);
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
});
} // 在 UI 上输出指定的信息
async private void OutputMessage(string message)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
lblMsg.Text += message;
lblMsg.Text += Environment.NewLine;
});
} // 显示图片
async private void ShowThumbnail(IRandomAccessStreamReference thumbnail)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
if (thumbnail != null)
{
IRandomAccessStreamWithContentType thumbnailStream = await thumbnail.OpenReadAsync();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(thumbnailStream); imgThumbnail.Source = bitmapImage;
}
});
} // 显示图片
async private void ShowBitmap(IRandomAccessStreamReference bitmap)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
if (bitmap != null)
{
IRandomAccessStreamWithContentType bitmapStream = await bitmap.OpenReadAsync();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(bitmapStream); imgBitmap.Source = bitmapImage;
}
});
} // 演示如何增加一个 QuickLink
private async void Button_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
QuickLink quickLink = new QuickLink
{
Id = "我是预定义数据,避免用户再次输入",
Title = "QuickLink Title", SupportedFileTypes = { "*" },
SupportedDataFormats =
{
StandardDataFormats.Text,
StandardDataFormats.Uri,
StandardDataFormats.Bitmap,
StandardDataFormats.StorageItems,
StandardDataFormats.Html,
"http://webabcd/sharedemo"
}
}; try
{
// 设置 QuickLink 的图标
StorageFile iconFile = await Package.Current.InstalledLocation.CreateFileAsync("Assets\\Logo.png", CreationCollisionOption.OpenIfExists);
quickLink.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile); // 完成共享操作,同时增加一个指定的 QuickLink
_shareOperation.ReportCompleted(quickLink);
}
catch (Exception ex)
{
OutputMessage(ex.ToString());
}
}
}
}

3、通过共享激活应用程序
App.xaml.cs

// 通过共享激活应用程序时所调用的方法
protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
var rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage), args);
Window.Current.Content = rootFrame; Window.Current.Activate();
}

OK
[源码下载]

重新想象 Windows 8 Store Apps (39) - 契约: Share Contract的更多相关文章

  1. 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract

    [源码下载] 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...

  2. 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract

    [源码下载] 重新想象 Windows 8 Store Apps (38) - 契约: Search Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 ...

  3. 重新想象 Windows 8 Store Apps 系列文章索引

    [源码下载][重新想象 Windows 8.1 Store Apps 系列文章] 重新想象 Windows 8 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  4. 重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo

    [源码下载] 重新想象 Windows 8 Store Apps (34) - 通知: Toast Demo, Tile Demo, Badge Demo 作者:webabcd 介绍重新想象 Wind ...

  5. 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解

    [源码下载] 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Toa ...

  6. 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解

    [源码下载] 重新想象 Windows 8 Store Apps (36) - 通知: Tile 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Tile ...

  7. 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件

    [源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...

  8. 重新想象 Windows 8 Store Apps (41) - 打印

    [源码下载] 重新想象 Windows 8 Store Apps (41) - 打印 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 打印 示例1.需要打印的文档Pr ...

  9. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

随机推荐

  1. BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库

    介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子 ...

  2. 【网络编程】——windows socket 编程

    测试demo #include <winsock2.h> #include <stdio.h> #include <string.h> #include <s ...

  3. OBS---环境配置之#include <D3DX10.h>报错

    一.先贴错误 因为这个笔记主要记录我如何整好这个OBS源码环境的,给需要的童鞋一个参考 1.1.#include <D3DX10.h>  报错 没有这个 解决方案:把2,3先解决了就水到渠 ...

  4. Python Flask UnicodeDecodeError 编码错误解决

    折腾Python做快速Web开发.最后定下来用Flask,相对教程全面. utf8编码上遇到问题,所有文件已经是utf8编码保存,加载css.js等静态文件,如果用GBK编码就正常:用utf8就报Un ...

  5. mac word 快捷键

      https://support.office.com/en-us/article/Word-keyboard-shortcuts-c0ca851f-3d58-4ce0-9867-799df7366 ...

  6. Linux探秘之I/O效率

    一.文章来由 最近看了<UNIX环境高级编程>,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对read.write.fread ...

  7. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  8. 金蝶EAS常用表

    select * from T_SCM_BillType where FName_L2 like '%委外%'   --单据类型表,查业务单据对应的表  102--销售出库单  330--应收单 se ...

  9. SNF开发平台WinForm之十四-站内发送系统信息-SNF快速开发平台3.3-Spring.Net.Framework

    1运行效果: 2开发实现: .组装站内信息发送实体对象. SNFService SNFService = new SNFService(); if (this.ucUser.SelectedIds ! ...

  10. Git使用日记

    git是个分布式的版本管理工具,现在我们前端这边用它做版本管理.之前也看过一些相关资料,不过没有使用它管理过项目代码.如今,用它也有段时间了所以就写些东西,仅供参考. ###快速上手 工作经常用到的几 ...