剪贴板不适用于从异步调用Silverlight返回的结果

时间:2016-03-03 22:50:06

标签: c# silverlight

我需要在剪贴板中异步设置从WCF服务返回的一些文本。 Clipboard类的问题在于它是线程安全的,因此在设置从服务返回的文本时,它会生成安全异常 - “不允许剪贴板访问”,我无法将文本复制到剪贴板。

任何人都可以提出解决方案..

1 个答案:

答案 0 :(得分: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是否要将数据复制到剪贴板时,您可以向用户显示一个对话框。这将为您提供允许剪贴板工作所需的用户启动操作。