Windows 8 Consumer Preview版升级到 Release Preview 版后Metro应用(html5+JavaScript版)修改小结

简介:

 Win8出来时参加了一个活动,写了一个APP,后来微软那边没什么动静了,就一直没怎么管了,最近系统升级从Consumer Preview版升级到 Release Preview 版,VS也升级到 Visual Studio 2012 RC 后,才发现原来的APP不能运行了,于是折腾了好一阵子才OK,现在做个小结,希望可以帮到遇到相同问题的朋友。

一、WinJS版本修改

  Windows 8 Consumer Preview版中WinJS是0.6版,Release Preview 版中WinJS是1.0版,所以要把项目中的WinJS进行升级。

  这个比较简单,大家直接按官方给出的步骤做就OK了:http://msdn.microsoft.com/en-us/library/windows/apps/JJ126963.aspx

  极少数情况下你的VS2012中没有1.0版的WinJS:

  遇到这种情况说明你的VS没有装好,修复安装就OK了。

二、满屏,半屏,还有小屏的页面状态方法的修改

  这个地方我遇到的症状就是程序闪一下就没了,不能打开。

  解决方案就是把 navigator.js 中的:

appView.getForCurrentView().onviewstatechanged = this._viewstatechanged.bind(this);

  改为:

window.onresize = this._viewstatechanged.bind(this);

  上面的方案来自:http://social.msdn.microsoft.com/Forums/et-EE/winappswithhtml5/thread/d02bf608-675d-4676-a4ec-3ccbc64671f1

  但仅仅改这一个地方是不完美的,因为这个文件里还有与这个相关的代码。所以还要把这行代码稍后的:

_viewstatechanged: function (eventObject) {
     (this._updateLayout.bind(this.pageControl))(this.pageElement, eventObject.viewState);
},

  改为(或直接添加下面这段代码也可以):

_resized: function (args) {
      if (this.pageControl && this.pageControl.updateLayout) {
          this.pageControl.updateLayout.call(this.pageControl,             
this.pageElement, appView.value, this.lastViewstate); } this.lastViewstate = appView.value; },

三、Share功能代码的修改

  由于我的应用在每个详细页提供了Share功能,如果大家的应用中没有这个功能就不用看这一条了。

  这个错误的症状为打开第二个有share功能的页面(或本页面打开两次)就会出现类似下面的错误:  

  • SCRIPT14: Exception was thrown but not handled in user code at line 112, column 17 in ms-appx://3fa1d0d0-fb4a-48c6-8e10-f40028f54bc3/js/itemDetailPage.js
    0x8000000e - JavaScript runtime error: A method was called at an unexpected time.
    WinRT information: An event handler has already been registered
    File: itemDetailPage.js, line: 112 column: 17

  在WinJS 0.6 版中 Share的代码大致是这样写的:

var dtm = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();

dtm.addEventListener("datarequested", onDataRequested);

function onDataRequested(e) {
    var request = e.request;
    request.data.properties.title = item.title;
    request.data.properties.description = "Test";
    request.data.setText(item.content);
}

  代码中的item是当前页面上绑定的数据项(新建一个Grid App项目,在itemDetail.js里就有)。

  在WinJS1.0里报的错大致可以看出是说 datarequested 事件已经注册了,所以会出错。

  一开始我尝试的是在添加事件之前先移除这个事件,但依然出错,后来想找到页面unload方法,想在这个方法里面移除事件,但貌似WinJS.UI不支持这个方法,试了好多次都不行后,找到了新的方案,就是添加一个全局变量作为标识,只注册一次。、

  但由于上面代码里的item是当前页面上绑定的数据项,这就导致了Share的数据是第一次打开详细页的数据,不会改变。最后直接把item.title和item.content改为从页面上获取,终于OK了,代码如下:

var dtm = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();

if (!isDatarequested) {
    dtm.addEventListener("datarequested", onDataRequested);
    isDatarequested = true;
}

function onDataRequested(e) {
    var request = e.request,
        title = document.querySelector("article .item-title").textContent,
        content = document.querySelector("article .item-content .content").textContent;
    request.data.properties.title = title;
    request.data.properties.description = "Test";

    request.data.setText(content);
}

  代码中的 isDatarequested 是一个全局bool变量,初始值为 false 。

  目前的方案可以解决问题,但还是不太明白为什么会出现重复注册事件问题,如果有朋友知道请不吝指点。

四、应用挂起和启动处理时的优化

  注意,这一点是优化,不是错误,所以如果你不修改也不会出错。

  在WinJS0.6版中default.js里有总分代码是这样的:

var app = WinJS.Application;
app.onactivated = function (eventObject) {
      if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) { 
           WinJS.UI.processAll();
      }
};

  在WinJS1.0中要改为这样:

var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var nav = WinJS.Navigation;
WinJS.strictProcessing();

app.addEventListener("activated", function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: This application has been newly launched. Initialize
            // your application here.
        } else {
            // TODO: This application has been reactivated from suspension.
            // Restore application state here.
        }

        if (app.sessionState.history) {
            nav.history = app.sessionState.history;
        }
        args.setPromise(WinJS.UI.processAll().then(function () {
            if (nav.location) {
                nav.history.current.initialPlaceholder = true;
                return nav.navigate(nav.location, nav.state);
            } else {
                return nav.navigate(Application.navigator.home);
            }
        }));
    }
});




本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

相关文章
|
2月前
|
安全 前端开发 Windows
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
本文介绍了 Electron 应用在 Windows 中的更新原理,重点分析了 `NsisUpdater` 类的实现。该类利用 NSIS 脚本,通过初始化、检查更新、下载更新、验证签名和安装更新等步骤,确保应用的更新过程安全可靠。核心功能包括差异下载、签名验证和管理员权限处理,确保更新高效且安全。
62 4
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
|
3月前
|
安全 搜索推荐 Windows
如何修复Windows 10升级错误0xa0000400
通过上述方法,即使面对棘手的错误0xa0000400,也能逐步定位问题并采取相应措施,让Windows 10升级之旅回归正轨。
192 1
|
3月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
3月前
|
XML 缓存 前端开发
Electron-builder 是如何打包 Windows 应用的?
本文首发于微信公众号“前端徐徐”,作者徐徐深入解析了 electron-builder 在 Windows 平台上的打包流程。文章详细介绍了 `winPackager.ts`、`AppxTarget.ts`、`MsiTarget.ts` 和 `NsisTarget.ts` 等核心文件,涵盖了目标创建、图标处理、代码签名、资源编辑、应用签名、性能优化等内容,并分别讲解了 AppX/MSIX、MSI 和 NSIS 安装程序的生成过程。通过这些内容,读者可以更好地理解和使用 electron-builder 进行 Windows 应用的打包和发布。
239 0
|
4月前
|
SQL JavaScript 数据库
sqlite在Windows环境下安装、使用、node.js连接
sqlite在Windows环境下安装、使用、node.js连接
|
3月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
67 0
|
5月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
112 0
|
5月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
90 0
|
5月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
148 0
|
24天前
|
安全 关系型数据库 MySQL
Windows Server 安装 MySQL 8.0 详细指南
安装 MySQL 需要谨慎,特别注意安全配置和权限管理。根据实际业务需求调整配置,确保数据库的性能和安全。
128 9