标签: windows-runtime

WinRT/UWP框架和页面缓存:如何在Navigate()上创建新页面实例并将页面实例保留在GoBack()上

我正在尝试用C#创建一个UWP(通用Windows应用程序)应用程序.我的问题是Frame控制:如果我没有使用它NavigationCacheMode = Required,每次用户返回时,页面都不会保留在内存中并将被重新创建.如果我设置NavigationCacheModeRequiredEnabled返回正常工作(没有新页面对象),如果我导航到同一类型的另一个页面,则前一页面对象将被回收并重复使用(无新页面实例).

期望的行为:

有没有办法使用原始Frame控件具有以下行为(如在Windows Phone中):

  1. 在上创建新的页面实例 Navigate()
  2. 保持页面实例 GoBack()

我知道的唯一解决方案是创建一个自己的Frame控件,但这会导致其他问题(例如:缺少SetNavigationState()方法等...)

示例场景:

用三页的简单应用实例:TvShowListPage,TvShowDetailsPage,SeasonDetailsPage.

  1. TvShowListPage是入口页面.点击后TvShow导航到TvShowDetailsPage.
  2. 现在在TvShowDetailsPage列表中选择一个季节并导航到TvShowDetailsPage.
  3. 如果向后导航,页面应保留在内存中以避免重新加载页面.
  4. 但是如果用户回到TvShowListPage并选择另一个,TvShowTvShowDetailsPage回收并且可能处于错误的状态(例如显示投射枢轴而不是第一个,季节枢轴)

我正在寻找默认的Windows Phone 7行为:导航在页面堆栈上创建一个新页面,返回从堆栈中删除首页并显示堆栈中的上一页(存储在内存中).

解:

因为没有这个问题的解决方案,我不得不重新实现所有分页相关的类:Page,Frame,SuspensionManager等...

库MyToolkit它提供了所有这些类可以在这里下载:https://github.com/MyToolkit/MyToolkit/wiki/Paging-Overview

参考文献:

.net xaml windows-8 windows-runtime win-universal-app

45
推荐指数
3
解决办法
2万
查看次数

在DataGrid的WinRT端口中,神秘的"没有足够的配额可用于处理此命令"

编辑9月26日

请参阅下面的完整背景.tl; dr:数据网格控件导致奇怪的异常,我正在寻找帮助隔离原因并找到解决方案.

我把它缩小了一点.我已经能够在较小的测试应用程序中重现行为,更可靠地触发不稳定的行为.

我绝对可以排除线程和(我认为)内存问题.新的应用程序不使用任务或其他线程/异步功能,我可以简单地通过向DataGrid中显示的对象类添加返回常量的属性来触发未处理的异常.这向我表明问题是在非托管资源耗尽或我尚未想到的问题.

修订后的计划结构如下.我创建了一个名为的用户控件EntityCollectionGridView,它有一个标签和一个数据网格.在控件的Loaded事件处理程序中,我将List<TestClass>数据网格分配给1000或10000行,让网格生成列.在页面OnNavigatedTo事件中的MainPage.xaml中将此用户控件实例化2-4次(或者Loaded,它似乎并不重要).如果发生异常,则会在显示MainPage后立即发生.

有趣的是,行为似乎并没有随着显示的行数而变化(它可以在10000行中可靠地工作,或者在每个网格中只有1000行可靠地失败),而是在所有网格中的总列数在给定时间加载.有20个属性显示,4个网格工作正常.有35个属性和4个网格,抛出异常.但是,如果我消除两个网格,同一个具有35个属性的类将正常工作.

请注意,我添加到TestClass20列到35列的所有属性都具有以下形式:

public string StringXYZ { get { return "asdfasdfasdfasdfasf"; } }
Run Code Online (Sandbox Code Playgroud)

因此,后备数据中没有额外的内存(同样,我认为内存压力无论如何都不是问题).

你们都觉得怎么样?同样,任务管理器中的句柄/用户对象/等看起来不错,但还有其他一些我可能会丢失的东西吗?

原帖

我一直在使用Silverlight Toolkit DataGrid到WinRT的端口,它在简单的测试(各种配置和多达10000行)中做得很好.但是,由于我试图将其嵌入到另一个WinRT应用程序中,我遇到了一个零星的异常(类型为System.Exception,在App.UnhandledException处理程序中引发),这种异常很难调试.

Not enough quota is available to process this command. (Exception from HRESULT: 0x80070718)
Run Code Online (Sandbox Code Playgroud)

该错误始终可重复,但不是确定性的.也就是说,我可以在每次运行应用程序时实现它,但并不总是通过执行相同次数的相同精确步骤来实现.错误似乎发生在页面转换(无论是向前导航到新页面还是返回到上一页),而不是(例如)更改数据网格的ItemsSource时.

应用程序结构基本上是通过层次结构的递归访问,每个层次结构级别都显示一个页面.在层次结构中当前节点的页面上,显示了每个子节点和一些孙子节点,并且对于任何子节点,可以显示数据网格.在实践中,我一直使用以下导航结构重现这一点:

Root page: shows no datagrid
  Child page: shows one datagrid and a few listviews
    Grandchild page: shows two datagrids, one bound to the
                     same source as Child page, the other one …
Run Code Online (Sandbox Code Playgroud)

c# xaml exception windows-runtime winrt-xaml

44
推荐指数
1
解决办法
3万
查看次数

使用Windows RT的客户端证书(Windows 8.1/Windows Phone 8.1)

我正在尝试Windows 8.1和Windows Phone 8.1的新功能,即证书存储和在服务器端使用客户端证书进行客户端身份验证的可能性.但是我遇到了这个功能的问题.

我有一个基本测试的WCF服务,它运行在IIS Express上.IIS express配置为支持SSL和客户端证书.在IIS(configurationhost.config)的配置文件中,我设置了这个:

<access sslFlags="SslRequireCert" /> (tried also SslNegotiateCert)
<clientCertificateMappingAuthentication enabled="true" />
Run Code Online (Sandbox Code Playgroud)

我在Windows RT应用程序中添加了客户端证书,如下所示:

//Install the self signed client cert to the user certificate store
string CACertificate = null;
try
{
    Uri uri = new Uri("ms-appx:///Assets/AdventureWorksTestClient1.pfx");
    var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);
    IBuffer buffer = await FileIO.ReadBufferAsync(file);
    using (DataReader dataReader = DataReader.FromBuffer(buffer))
    {
       byte[] bytes = new byte[buffer.Length];
       dataReader.ReadBytes(bytes);
       // convert to Base64 for using with ImportPfx
       CACertificate = System.Convert.ToBase64String(bytes);
    }
    await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
            CACertificate,
            "", …
Run Code Online (Sandbox Code Playgroud)

c# client-certificates windows-runtime windows-8.1 windows-phone-8.1

42
推荐指数
1
解决办法
1817
查看次数

如何解决错误“必须使用PackageReference”?

添加WindowsRuntime到 WinForms 项目后,构建项目失败并显示错误“必须使用 PackageReference”。构建日志更精确:

C:[...]\Visual Studio 2017\Projects\Projectname\packages\Microsoft.Windows.SDK.Contracts.10.0.18362.2005\build\Microsoft.Windows.SDK.Contracts.targets(4,5): 错误:必须使用包参考

这是我所做的:

安装包 Microsoft.Windows.SDK.Contracts

参考:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll,
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades\System.Runtime.dll
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades\System.Threading.Tasks.dll
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades\System.IO.dll
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades\System.Runtime.InteropServices.WindowsRuntime.dll。

它可能与 .NET 版本有关吗?在项目的 packages.config 中有 4.6,而项目的目标是 4.5。

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Windows.SDK.Contracts" version="10.0.18362.2005" targetFramework="net45"/>
<package id="System.Runtime.WindowsRuntime" version="4.6.0" targetFramework="net45" />
<package id="System.Runtime.WindowsRuntime.UI.Xaml" version="4.6.0" targetFramework="net45" />
</packages>
Run Code Online (Sandbox Code Playgroud)

没有编译错误……只有这个奇怪的“PackageReference”错误。

c# winforms windows-runtime visual-studio-2017

39
推荐指数
2
解决办法
3万
查看次数

使用Java创建Windows Metro风格的应用程序?

我知道如何用Java创建小型桌面应用程序.我想知道,我可以用Java制作Windows Metro风格的应用程序吗?因为在Web上只提到了C++/C/C#/ JavaScript等.如果是的话,请给我一些快速入门的参考.如果不是哪一个将是最简单的语言开始?

java windows-8 windows-runtime

38
推荐指数
2
解决办法
2万
查看次数

在C#中将HTML实体转换为Unicode字符

我发现Python和Javascript的类似问题和答案,但不适用于C#或任何其他WinRT兼容语言.

我认为我需要它的原因是因为我正在显示我从Windows 8商店应用程序中的网站获得的文本.比如&eacute;应该成为é.

或者,还有更好的方法?我没有显示网站或RSS订阅源,只是列出了网站及其标题.

c# html-encode html-entities windows-runtime

37
推荐指数
3
解决办法
3万
查看次数

Windows 8商店应用程序(Metro)是否在Windows 7或XP中运行?

我想知道使用Visual Studio 11 Developer Preview和.Net FrameWork 4.5开发的Metro应用程序是否可以在Windows 7或XP中运行.

不是正常的Windows窗体或WPF,我想知道所有新的Metro应用程序.

在Windows XP或Windows 7中运行Metro Apps需要哪些新功能

windows-7 microsoft-metro windows-8 windows-runtime windows-store-apps

36
推荐指数
2
解决办法
7万
查看次数

无法激活Windows应用商店应用

我安装了Windows 8 Pro的零售版.我下载并安装了Visual Studio Express 2012.我要求并获得了开发人员证书.然后我尝试创建一个hello world app.

当我尝试调试应用程序时,从那里得到"无法激活Windows应用商店应用"消息框.网上的大多数评论都说删除构建目录.这不适合我

有没有人有解决方案如何解决这个问题并调试我的应用程序?

visual-studio windows-8 windows-runtime

36
推荐指数
5
解决办法
4万
查看次数

以编程方式动画(平滑)ScrollViewer

有没有办法ScrollViewer在Windows Phone 8.1 Runtime中平滑地设置垂直偏移量?

我尝试过使用该ScrollViewer.ChangeView()方法,无论是否将disableAnimation参数设置为true或false,都不会对垂直偏移的更改进行动画处理.

例如:myScrollViewer.ChangeView(null, myScrollViewer.VerticalOffset + p, null, false); 偏移在没有动画的情况下更改.

我也试过使用垂直偏移中介:

/// <summary>
/// Mediator that forwards Offset property changes on to a ScrollViewer
/// instance to enable the animation of Horizontal/VerticalOffset.
/// </summary>
public sealed class ScrollViewerOffsetMediator : FrameworkElement
{
    /// <summary>
    /// ScrollViewer instance to forward Offset changes on to.
    /// </summary>
    public ScrollViewer ScrollViewer
    {
        get { return (ScrollViewer)GetValue(ScrollViewerProperty); }
        set { SetValue(ScrollViewerProperty, value); }
    }
    public static …
Run Code Online (Sandbox Code Playgroud)

c# windows-runtime winrt-xaml windows-phone-8.1

36
推荐指数
1
解决办法
5078
查看次数

挂起事件不使用WinRT引发

我在使用WinRT在Windows Phone 8.1上暂停事件时遇到问题,它不会触发.我不知道为什么.这是我的代码:

/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
    InitializeComponent();

    Suspending += OnSuspending;
#if DEBUG
    this.displayRequest = new DisplayRequest();
#endif
}

/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory …
Run Code Online (Sandbox Code Playgroud)

c# windows-runtime windows-phone-8.1 win-universal-app uwp

35
推荐指数
1
解决办法
8360
查看次数