Silverlight IsolatedStorageFile.IncreaseQuotaTo - PullRequest
0 голосов
/ 17 мая 2011

Msdn doc для IsolatedStorageFile.IncreaseQuotaTo гласит:

Чтобы увеличить квоту, необходимо позвонить этот метод от пользователя событие, например, в обработчике события для событие нажатия кнопки. Когда вы звоните метод IncreaseQuotaTo, общий языковая среда выполнения в Silverlight представляет диалоговое окно для пользователя утвердить заявку. Если пользователь отклоняет запрос, этот метод возвращает false и квота остается того же размера.

Как Silverlight узнает, что метод был вызван из инициируемого пользователем события, такого как нажатие кнопки, а не из какого-либо другого потока?

Более конкретно: что такое событие, инициированное пользователем? Есть ли способ преодолеть это ограничение?

И еще один вопрос:

Я делаю некоторые автоматические загрузки файлов, когда пользователь впервые обращается к моему приложению, но я не хочу, чтобы пользователь нажимал «Скачать», а затем, когда я обнаружил, что требуется больше места, вызову IncreaseQuota и у меня появляется «Silverlight диалог» с запросом для большего пространства.

Я хочу начать загрузку автоматически (не по инициативе пользователя), и, если я обнаружу, что требуется больше места, вызовите IncreaseQuota и, следовательно, появится «диалог Silverlight». (Пользователь не нажимает кнопку загрузки).

Ответы [ 2 ]

6 голосов
/ 18 мая 2011

После долгих раскопок я выяснил, что такое событие, инициированное пользователем.Кажется, что 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 запрашивает больше места для хранения:).

Это будетНа самом деле, это брешь в безопасности.

Если бы они реализовали это с помощью диалогового окна на уровне страниц, то, возможно, это было бы легче взломать (или обойти).

Так что в общем, подумав об этом,Я начинаю понимать, почему они реализовали это так и почему существуют эти ограничения.

0 голосов
/ 17 мая 2011

Документация не неполная.

Если я сделаю это ... button_click(..) { new UserControl() } ... Это все еще считается событием, инициированным пользователем?

Да. Но чего на самом деле достиг этот маленький кусочек дополнительного кода?

То, с чем я лично никогда не экспериментировал, это именно то, что составляет пользовательское событие; IOW - наведение мыши считается событием пользователя? Это будет очень просто для вас, и вы можете поэкспериментировать с множеством других вещей. При необходимости у вас может появиться всплывающее окно с заставкой, которое приветствует пользователя, и ему нужно щелкнуть по нему, чтобы закрыть его, после чего вы делаете запрос. Это может показаться немного банальным, но вы можете сойти с рук с такими вещами, если представите это хорошо.

Обратите внимание, что подсказка является одноразовой. Если вы запрашиваете пользователя, и он соглашается, что хранилище для вашего приложения сохраняется между визитами, а это значит, что вам не нужно запрашивать его снова при следующем использовании вашего элемента управления, ваша квота все еще увеличивается с прошлого раза (если пользователь намеренно удалил его, что можно сделать, щелкнув правой кнопкой мыши элемент управления Silverlight и перейдя на вкладку «Хранилище приложений»).

...