我是Silverlight的新手,我正在做一些测试。在我目前的测试中,我尝试实时显示当前的剪贴板内容。但是这段代码有一些奇怪的行为:
namespace SilverlightTest
{
public partial class MainPage : UserControl
{
private Timer _timer;
public MainPage()
{
InitializeComponent();
var dispatcher_timer = new DispatcherTimer {Interval = new TimeSpan(0, 0, 0, 5)};
dispatcher_timer.Tick += new EventHandler(timer_Callback);
dispatcher_timer.Start();
}
private void timer_Callback(object state, EventArgs eventArgs)
{
current_clip_board.Content = Clipboard.GetText();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
current_clip_board.Content = Clipboard.GetText();
}
}
}
按钮事件和计时器事件假设执行完全相同的操作。 但事实并非如此! Button工作正常并将剪贴板文本设置为标签,但计时器抛出异常:
不允许剪贴板访问
问题是:为什么? :)
感谢。
PS:我打赌线程问题:p
答案 0 :(得分:4)
剪贴板访问,在部分信任(浏览器中)Silverlight应用程序(您可能在上面提到的场景)中受到限制。只有在Silverlight运行时确定由用户启动的方案中才能访问GetText属性。您的示例很完美 - 例如按一下按钮。然而,调度计时器不是用户启动的,因此该属性会抛出异常(这在浏览器内应用程序的上下文中尤其重要,如果您可以创建一个只在其中静默运行的Silverlight应用程序,这可能是一个很大的安全漏洞。浏览器,在他们不知情的情况下观看用户的剪贴板更新。
有关详细信息,请参阅此clipboard documentation。
答案 1 :(得分:2)
只需触发Clipboard.ContainsText()而不是Text。允许使用ContainsText方法!
答案 2 :(得分:1)
你试过这个:
private void timer_Callback(object state, EventArgs eventArgs)
{
Dispatcher.Invoke(new System.Threading.ThreadStart(delegate()
{
current_clip_board.Content = Clipboard.GetText();
}
}
修改
快速搜索后,Clipboard
似乎只有在响应用户操作时才会显示here和here。
部分信任(默认模式为 浏览器托管的基于Silverlight的 应用程序),Silverlight也 限制剪贴板访问它们的两个 关键API GetText和SetText。这些 API只能在a中调用 上下文由...决定 Silverlight运行时要响应 用户发起的动作。对于 例如,剪贴板访问有效 来自Click或者的处理程序 KeyDown事件。相比之下,剪贴板 访问权限从处理程序无效 加载或来自构造函数,和 访问尝试抛出异常。
答案 3 :(得分:1)
如果您唯一的选择是使用计时器,那么根本不要这样做。 clipboad是一个共享资源,当他们尝试访问剪贴板时,您将在其他程序中引发“无法打开剪贴板”错误。即用户从WinWord复制内容,WinWord尝试打开剪贴板,但不能,因为你在检查它时已将其锁定。
答案 4 :(得分:0)
你好,这对我有用,但只适用于IE Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() => HtmlPage.Window.Eval("window.clipboardData.setData('Text','testtestest')"));
只需使用getData方法