繁体   English   中英

Silverlight IsolatedStorageFile.IncreaseQuotaTo

[英]Silverlight IsolatedStorageFile.IncreaseQuotaTo

IsolatedStorageFile.IncreaseQuotaTo Msdn文档指出:

若要增加配额,必须从用户启动的事件中调用此方法,例如在按钮单击事件的事件处理程序中。 当您调用IncreaseQuotaTo方法时,Silverlight中的公共语言运行库将显示一个对话框,供用户批准请求。 如果用户拒绝该请求,则此方法返回false,并且配额保持不变。

Silverlight如何知道该方法是从用户启动的事件(如按钮单击)而不是其他某个线程中调用的?

更具体地说:什么是用户发起的事件? 有什么办法可以克服这个限制?

还有一个问题:

当用户首次访问我的应用程序时,我会进行一些文件的自动下载,但是我不希望用户按“下载”,然后当我检测到需要更多空间时,请调用“增加配额”,并出现“ Silverlight对话框”,要求更多空间。

我想自动开始下载(不是用户启动的),并且如果我检测到需要更多空间,请调用IncreaseQuota,因此出现“ Silverlight对话框”。 (没有用户按下载)。

经过大量的挖掘,我确实发现了用户发起的事件是什么。 似乎msdn doc在与“事件概述”相关的部分中指定了用户启动的事件,但是IsolatedStorageFile.IncreaseQuotaTo文档和事件概述之间没有链接。

因此,根据定义,用户启动的事件为:

Silverlight强制要求仅在处理用户启动事件的处理程序的上下文中允许某些操作。 以下是此类操作的列表:

设置IsFullScreen。

显示某些对话框。 这包括SaveFileDialog,OpenFileDialog和PrintDocument.Print显示的打印对话框。

从HyperlinkBut​​ton导航。

访问主要的剪贴板API。

Silverlight用户启动的事件包括鼠标事件(例如MouseLeftButtonDown)和键盘事件(例如KeyDown)。 基于此类事件的控件的事件(例如Click)也被认为是用户启动的。

需要用户启动的API调用应在事件处理程序中尽快调用。 这是因为Silverlight用户启动概念还要求在事件发生后的特定时间范围内进行调用。 在Silverlight 4中,此时间窗口约为一秒钟。

用户启动的事件限制也适用于JavaScript API for Silverlight的用法。

当Silverlight处于全屏模式时,出于安全原因,故意限制了某些输入事件,尽管使用增强的信任度可以减轻浏览器外应用程序的负担。 有关更多信息,请参见全屏支持。

尽管我在“操作”列表中没有看到“ IncreaseQuotaTo”,但我猜想它们只是忘记了,因为其行为/限制与文档中所述的相同。

我很想知道Silverlight如何确切地知道用户发起的事件是什么,但是在挖掘.net框架源代码后,我陷入了死胡同:

if ((browserService == null) || !browserService.InPrivateMode())
{
    //..
}
return false; //means that IncreaseQuota will fail

其中browser.IsInPrivateMode是:

[SecuritySafeCritical]
public bool InPrivateMode()
{
    bool privateMode = false;
    return (NativeMethods.SUCCEEDED(UnsafeNativeMethods.DOM_InPrivateMode(this._browserServiceHandle, out privateMode)) && privateMode);
}

DOM_InPrivateMode在DllImport [“ agcore”]中,根据微软的说法,这是机密的:(因此,看来我不会很快发现他们如何检测用户发起的事件。

仔细考虑一下,我猜微软不希望用户在浏览器中打开许多选项卡,然后装腔作势:我会自动调用GrowthQuotaTo。

GrowthQuotaTo是浏览器模式对话框。 这意味着您在处于活动状态时无法导航到其他浏览器选项卡。 因此,如果用户现在已经从我的页面移至google.com的标签,并且如果我能够延迟调用CallingQuotaTo,则用户可能会认为google.com要求更多存储空间:)。

这确实是一个安全漏洞。

如果他们使用页面级对话框来实现这一点,那么可能会更容易被黑(或解决)。

因此,总的来说,考虑到这一点,我开始明白为什么他们要像这样实现它,以及为什么存在这些限制。

文档并不完整。

如果我这样做... button_click(..) { new UserControl() } ...这是否仍算作用户启动的事件?

是。 但是,这些额外的代码真正实现了什么呢?

我个人从未尝试过的正是构成用户事件的原因。 IOW是鼠标悬停在用户事件上吗? 这对于您来说非常简单,您还可以尝试其他多种方法。 如有必要,您可能会弹出一个欢迎用户的弹出屏幕,他们必须单击该屏幕才能将其关闭,此时您可以发出请求。 看起来有些老套,但如果演示得当,则可以避免此类问题。

请注意,提示是一次性的。 如果您提示用户并且他们接受,则存储将在两次访问之间为您的应用程序保留,这意味着您无需在他们下次使用控件时再次提示他们,配额仍会比上一次增加(除非用户已故意删除它,可以通过右键单击Silverlight控件,然后转到“应用程序存储”选项卡来执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM