我需要在剪贴板中异步设置从WCF服务返回的一些文本。 Clipboard类的问题在于它是线程安全的,因此在设置从服务返回的文本时,它会生成安全异常 - “不允许剪贴板访问”,我无法将文本复制到剪贴板。
任何人都可以提出解决方案..
答案 0 :(得分:1)
部分信任(浏览器托管的默认模式) 基于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是否要将数据复制到剪贴板时,您可以向用户显示一个对话框。这将为您提供允许剪贴板工作所需的用户启动操作。