2016-03-03 2 views
1

Мне нужно настроить некоторый текст, возвращенный из службы WCF асинхронно в буфер обмена. Проблема с классом Clipboard заключается в том, что он потокобезопасен, поэтому при установке текста, возвращаемого из сервиса, он генерирует Security Exception - «Доступ к буфер обмена не разрешен», и я не могу скопировать текст в буфер обмена.Буфер обмена не работает для результата, возвращаемого из вызовов aync. Silverlight

Может кто-нибудь пожалуйста, предложить решение ..

ответ

1

Согласно clipboard documentation здесь

В режиме частичного доверия (режим по умолчанию для браузера организовано Silverlight-приложений), Silverlight также ограничивает буфер обмена доступа к его двум ключевым API-интерфейсам GetText и SetText. Эти API могут быть только , вызванные из контекста, который определяется средой Silverlight , чтобы быть в ответ на инициированное пользователем действие. Например, доступ к буферам обмена действителен из обработчика события Click или KeyDown . Напротив, доступ к буферу недействителен из обработчика для Загружен или из конструктора, и попытки доступа исключают исключения.

Кроме того, Silverlight запрашивает подтверждение пользователя, если к буферу осуществляется доступ под частным доверием. Это диалоговое окно подтверждения доступа Silverlight отображается один раз за сеанс. Если вы специально создаете приложение, отличное от браузера, и запрашиваете повышенное доверие, это ограничение безопасности для API и его диалоговое окно не используются.

Это заявленное решение для этого ограничения.

Когда данные возвращаются из службы, они должны храниться в переменной, а пользователю предоставляется кнопка для щелчка, где данные будут скопированы в буфер обмена.

string data = ""; 

... 
void LoadDataAsync() {   
    //Service call populates variable. 
    //When service call completes Button is enabled allowing user to click 
} 
... 

private void OnButtonClick(object sender, System.Windows.RoutedEventArgs e) { 
    System.Windows.Clipboard.SetText(data); 
} 

Вы можете представить пользователю диалоговое окно, когда служба завершает уведомления пользователя о том, завершения загрузки и попросить идентификатор они хотят, чтобы скопировать данные в буфер обмена. Это даст вам инициированное пользователем действие, необходимое для работы буфера обмена.