После долгих раскопок я выяснил, что такое событие, инициированное пользователем.Кажется, что msdn doc указывает, какое событие инициировалось пользователем в разделе, связанном с «обзором событий», но нет никакой связи между документацией IsolatedStorageFile.IncreaseQuotaTo и Обзор событий
Таким образом, инициируемое пользователем событие в соответствии с определением:
Silverlight обеспечивает, что определенные операции разрешены только в контексте обработчика, который обрабатывает инициированное пользователем событие.Ниже приведен список таких операций:
Настройка IsFullScreen.
Отображение определенных диалогов.Это включает в себя SaveFileDialog, OpenFileDialog и диалоговое окно печати, отображаемое PrintDocument.Print.
Навигация из HyperlinkButton.
Доступ к основному API буфера обмена.
Silverlight события, инициируемые пользователемвключают события мыши (такие как MouseLeftButtonDown) и события клавиатуры (такие как KeyDown).События элементов управления, основанные на таких событиях (например, Click), также считаются инициированными пользователем.
Вызовы API, требующие инициации пользователя, должны вызываться как можно скорее в обработчике событий.Это связано с тем, что концепция инициирования пользователя Silverlight также требует, чтобы вызовы происходили в течение определенного временного окна после возникновения события.В Silverlight 4 это временное окно составляет приблизительно одну секунду.
Ограничения инициируемых пользователем событий также применяются к использованию JavaScript API для Silverlight.
Когда Silverlight находится в полноэкранном режиме, некоторые вводятсобытия преднамеренно ограничены по соображениям безопасности, хотя это может быть смягчено для приложений вне браузера, использующих повышенное доверие.Для получения дополнительной информации см. Поддержка полного экрана.
Хотя я не вижу «IncreaseQuotaTo» в списке «операций», я думаю, они просто забыли об этом, так как поведение / ограничениятакие же, как те, что описаны в документе.
Меня интересовало, как именно Silverlight знает, что такое событие, инициированное пользователем, но после того, как я покопался в исходном коде .net Framework, я попал в тупик:
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"], который согласно Microsoft является конфиденциальным :( Так что похоже, что я не будускоро узнайте, как они обнаруживают инициированные пользователем события.
Подумав об этом больше, я думаю, что Microsoft не хотела, чтобы у пользователя было открыто много вкладок в браузере, а затем пуф: я автоматически вызываю IncreaseQuotaTo.
IncreaseQuotaTo - это модальное диалоговое окно браузера. Это означает, что вы не можете переходить на другие вкладки браузера, когда он активен. Так что, если пользователь переместился сюдаПерейдите на вкладку с google.com, и если я смогу позвонить в IncreaseQuotaTo с задержкой, пользователь может подумать, что google.com запрашивает больше места для хранения:).
Это будетНа самом деле, это брешь в безопасности.
Если бы они реализовали это с помощью диалогового окна на уровне страниц, то, возможно, это было бы легче взломать (или обойти).
Так что в общем, подумав об этом,Я начинаю понимать, почему они реализовали это так и почему существуют эти ограничения.