2016-03-03 65 views
1

我需要在剪贴板中异步设置从WCF服务返回的一些文本。 Clipboard类的问题在于它线程安全,因此在设置服务返回的文本时,它会生成安全性异常 - “剪贴板访问不被允许”,我无法将我的文本复制到剪贴板。剪贴板不适用于从异步调用返回的结果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); 
} 

当服务完成通知下载完成用户你可以看到一个对话框呈现给用户,并要求他们希望将数据复制到剪贴板ID。这将为您提供允许剪贴板工作所需的用户启动的操作。