如何让你的UWP应用程序无缝调用几何作图
有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事。其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是肯定的。
UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等。
如今,微软丰富了Launcher的功能,通过新增的LaunchUriForResultsAsync API,Windows应用程序可以相互启动并交换数据和文件。利用这个新的API,使得以前需要多个App才能完成的复杂任务现在可以无缝的进行处理,使用户根本无法感觉到应用之间的切换。比如我们可以构想这么一个场景:在一个文本编辑APP中打开一个几何作图APP,完成几何作图后返回几何图片及数据到文本编辑APP。然后点击该图片即可以再次启动几何作图APP编辑几何图形,编辑图形完成后,传递新的图片返回原APP。
首先我们需要从Windows 10 应用商店中安装一个几何作图APP。这里以“活动几何”APP为例,选择它的原因是:1.免费;2.有中文界面;3功能足够。
然后我们就可以上代码了:
Xaml 代码:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="20">
<Button x:Name="DoTest" Content="Do test" Click="DoTest_Click" />
<CheckBox x:Name="IsIncludeProcess" Content="IncludeProcess" IsChecked="True" />
<TextBlock x:Name="ShowMessage" Foreground="Red" />
<Button x:Name="DoEdit" Content="Edit the Geometry" Click="DoEdit_Click" Visibility="Collapsed" /> <ScrollViewer Height="600" Width="800" >
<Image x:Name="ShowImage" />
</ScrollViewer>
</StackPanel>
</Grid>
我们的Sample App界面是这样的(为突出重点,省去文本编辑功能代码):
在“Do test”按钮点击事件函数中:
定义一个LauncherOptions变量,设置属性TargetApplicationPackageFamilyName 为该几何作图APP的PackageFamilyName,这里为62301LeonLi.ActiveGeometry_496e9sjp76zt6 :
var options = new LauncherOptions();
options.TargetApplicationPackageFamilyName = "62301LeonLi.ActiveGeometry_496e9sjp76zt6";
定义一个启动Uri变量:
Uri uri = new Uri("ag.editgeometry:?");
还需要一个传入参数的ValueSet变量 inputData:
ValueSet inputData = new ValueSet();
这样就可以调用LaunchUriForResultsAsync函数启动几何作图APP并将返回结果赋值给LaunchUriResult变量:
LaunchUriResult resultData = await Launcher.LaunchUriForResultsAsync(uri, options, inputData);
启动该几何作图APP后是这样的:
在几何作图完成后,点击返回按钮:
resultData的属性Status 为 LaunchUriStatus.Success 的话,就表示成功了。下面的代码是对返回的结果进行处理:
ValueSet theValues = resultData.Result;
var resultState = theValues["ReturnedState"] as string;
switch (resultState)
{
case "Success":
if (theValues.ContainsKey("ImgFileToken"))
{
var tokenObject = theValues["ImgFileToken"];
if (tokenObject != null)
{
var token = tokenObject.ToString();
var imgFile = await SharedStorageAccessManager.RedeemTokenForFileAsync(token);
if (imgFile != null)
{
try
{
IRandomAccessStream imageStream = await imgFile.OpenReadAsync();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(imageStream);
ShowImage.Source = bitmapImage;
}
finally { }
}
}
} if (theValues.ContainsKey("DataFileToken"))
{
var tokenObject = theValues["DataFileToken"];
if (tokenObject != null)
{
var token = tokenObject.ToString();
var dataFile = await SharedStorageAccessManager.RedeemTokenForFileAsync(token);
if (dataFile != null)
{
var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
file_demonstration = await dataFile.CopyAsync(localFolder);
DoEdit.Visibility = Visibility.Visible;
}
}
}
ShowMessage.Text = "Success";
break; }
}
StorageFile file_demonstration;
imgFile是传回的图片文件,可以将该图片插入你想要的地方;dataFile是相应的数据文件,将该文件拷贝到你自己APP的目录下,用文件变量file_demonstration记住它,如果选择了“IsIncludeProcess”,则该文件中还包括了作图过程的数据。现在Sample App是这样的了:
可以看到在得到的几何图上新出现了一个“Edit the Geometry”按钮,这是用于再次编辑该几何图形的:
private async void DoEdit_Click(object sender, RoutedEventArgs e)
{
if (file_demonstration == null)
return; var token = SharedStorageAccessManager.AddFile(file_demonstration);
ValueSet inputData = new ValueSet();
inputData.Add("EditFileToken", token);
await EditGeometry(true, inputData);
}
完整的代码如下:
namespace CallEditGeometryAppSample
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
} private async void DoTest_Click(object sender, RoutedEventArgs e)
{
EditGeometry(true);
} public async void EditGeometry(bool needResult)
{
bool isNew = true; ValueSet inputData = new ValueSet();
if (isNew)
{
}
else
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.List;
openPicker.FileTypeFilter.Add(".sam");
openPicker.FileTypeFilter.Add(".sdz");
var gpxFile = await openPicker.PickSingleFileAsync();
if (gpxFile == null)
{
return;
} var token = SharedStorageAccessManager.AddFile(gpxFile);
inputData.Add("EditFileToken", token);
} await EditGeometry(needResult, inputData); } private async System.Threading.Tasks.Task EditGeometry(bool needResult, ValueSet inputData)
{
var options = new LauncherOptions();
options.TargetApplicationPackageFamilyName = "62301LeonLi.ActiveGeometry_496e9sjp76zt6"; Uri uri = new Uri("ag.editgeometry:?"); if (!needResult)
{
await Launcher.LaunchUriAsync(uri, options, inputData);
ShowMessage.Text = "No Reuslt Success";
}
else
{
if (!IsIncludeProcess.IsChecked.Value)
{
inputData.Add("IncludeProcess", "N");
} LaunchUriResult resultData = await Launcher.LaunchUriForResultsAsync(uri, options, inputData);
ShowMessage.Text = resultData.Status.ToString();
if (resultData.Status == LaunchUriStatus.Success &&
resultData.Result != null &&
resultData.Result.ContainsKey("ReturnedState"))
{
ValueSet theValues = resultData.Result;
var resultState = theValues["ReturnedState"] as string;
switch (resultState)
{
case "Success":
if (theValues.ContainsKey("ImgFileToken"))
{
var tokenObject = theValues["ImgFileToken"];
if (tokenObject != null)
{
var token = tokenObject.ToString();
var imgFile = await SharedStorageAccessManager.RedeemTokenForFileAsync(token);
if (imgFile != null)
{
try
{
IRandomAccessStream imageStream = await imgFile.OpenReadAsync();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(imageStream);
ShowImage.Source = bitmapImage;
}
finally { }
}
}
} if (theValues.ContainsKey("DataFileToken"))
{
var tokenObject = theValues["DataFileToken"];
if (tokenObject != null)
{
var token = tokenObject.ToString();
var dataFile = await SharedStorageAccessManager.RedeemTokenForFileAsync(token);
if (dataFile != null)
{
var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
file_demonstration = await dataFile.CopyAsync(localFolder);
DoEdit.Visibility = Visibility.Visible;
}
}
}
ShowMessage.Text = "Success";
break;
case "Error":
var resultMessage = theValues["ReturnedMessage"] as string;
if (resultMessage == "Duplicate")
{
string mes = "Active Geometry has opened another windows. Please close it first.";
ShowMessage.Text = mes;
} var isCloseByOther = theValues["ByOtherClosed"] as string;
if (isCloseByOther != "Y")
{
ShowMessage.Text += " --- By Other Closed";
}
break;
}
}
}
} StorageFile file_demonstration; private async void DoEdit_Click(object sender, RoutedEventArgs e)
{
if (file_demonstration == null)
return; var token = SharedStorageAccessManager.AddFile(file_demonstration);
ValueSet inputData = new ValueSet();
inputData.Add("EditFileToken", token);
await EditGeometry(true, inputData);
}
}
}
如果你连拷贝代码都懒得话,就下载这个sample的压缩文件吧!
如何让你的UWP应用程序无缝调用几何作图的更多相关文章
- [AIR] AIR 应用程序的调用和终止
本节讨论几种对已安装的 Adobe® AIR® 应用程序进行调用的方法,以及关闭运行中的应用程序的选项和注意事项. 注: NativeApplication.InvokeEvent 和 Browser ...
- 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案
方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...
- iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话,iTunes,iBooks )
在网上找到了下在记录下来以后方便用 在程序中调用系统自带的应用,比如我进入程序的时候,希望直接调用safar来打开一个网页,下面是一个简单的使用:
- Asp反向代理程序,调用远程站点全站数据,一款脚本级反向代理程序.
前些天临时写的一脚本级反向代理程序,用法很简单,设置好目标站地址,然后放到你网站根目录:index.asp,再将404页面自定义为:index.asp,即可. 由于暂时没有 url 替换需要,所以没有 ...
- Java程序中调用Python脚本的方法
在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- 发布在IIS上的Web程序,调用服务器的COM组件
场景大致是这样的,在工厂中分布着许多的PDA点,这些PDA点都要进行实时的扫描--打印操作.实现方法是采用网络打印机,然后服务器安装驱动,管理着所有的打印机.然后服务器,发布一个WebService, ...
- Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)
文章目录: 1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...
- 存储过程系列之存储过程sql数据库调用和程序代码调用
1.存储过程,无参数的存储过程 创建无参数存储存储过程 Create Procedure DCEMREMR_TEMPLATEAs SELECT TOP 10 [FILENAME],[FILETITLE ...
随机推荐
- 8.16 CSS知识点7
display(元素显示模式) 语法: display : block | none | inline | inline-block display 属性用来设置元素的显示方式. block ...
- VC++ MFC获取对话框上控件的位置
CRect rect; GetDlgItem(控件ID)->GetWindowRect(&rect);//获取控件的屏幕坐标 ScreenToClient(&rect);//转换 ...
- Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例
遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例: #-*- encoding: utf-8 -*- __author__ = 'liudong' import linecache,sys ...
- ora-02429:无法删除用于强制唯一/主键的索引
今天打算删除orcale数据库中无用的表空间,发现报错,查资料删除,写个过程留着备用. 1.drop tablespace dldata INCLUDING CONTENTS CASCADE CONS ...
- HashTable 简述
1.解释:使用了映射函数,把值映射到对应的位置,key-> address, address是表中的存储位置,不是实际的地址: 2.Hash 函数设计, 分布合理,冲突少,利用率平衡,利用率 ...
- 【Python全栈笔记】05 [模块二] 19 Oct 文件的操作
文件操作 一般步骤1. 文件打开 2. 文件操作 3. 文件关闭 1. 打开文件 使用open(文件名(绝对路径), 打开模式, 编码) 文件打开的模式有: r: 只读模式(默认) w: 只写模式 ...
- linux命令(6):rmdir 命令
rmdir命令 rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删除某目录时也必须具有对父目录的写 ...
- app进入后台之后接收到通知,点进去进入新的页面,再次进入后台,再点击通知进入页面(,两次通过通知进入的页面,创建了两次,会多一个页面,)解决办法监听
在点击通知进入的页面的 //UIApplicationWillResignActiveNotification是app即将进入后台的方法 //增加监听使它在进入后台之前pop上一个页面 - (void ...
- poj 2594 Treasure Exploration (二分匹配)
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 6558 Accepted: 2 ...
- mysql从零开始
常用的数据库有哪些? oralce,sqlserver,mysql,db2 有钱就用oracle吧 oracle和mysql的区别:https://zhidao.baidu.com/question/ ...