我有一个对话框,用户可以在其中编辑某些字段。有3个具体验证。对于这些字段,我创建了一个粘贴处理器,如下所示:
DataObject.AddPastingHandler(myTextBox, numericValidatorHandler);
当我尝试在处理程序中显示消息框时,我得到一个异常。似乎粘贴运行在另一个线程中......
我目前的解决方法是使用后台工作程序并设置两个事件DoWork和RunWorkerCompleted。
在第一个中,我使用一些args设置结果,我通过' Argument'传递给numericValidatorHandler。属性
' numericValidatorHandler'
bw.RunWorkerAsync(args);
...
' DoWorkHandler'
e.Result = e.Argument;
...
' RunWorkerCompletedHandler'
//Here I just use e.Result to create an output message for the messagebox
是否有更简单的方法在过去的事件处理程序中显示MessageBox?
答案 0 :(得分:1)
您可以使用Dispatcher
类将工作项添加到UI线程工作项队列中。试试这个:
public void DataObjectPastingEventHandler(object sender, DataObjectPastingEventArgs e)
{
Dispatcher.CurrentDispatcher.Invoke((Action)delegate()
{
MessageBox.Show("Hello");
});
}
更新>>>
您可以尝试一些事项......首先是您初始化UI线程上的Dispatcher
。在Window
构造函数或Loaded
事件处理程序中调用它,您可以确保UI线程正在运行:
Dispatcher uiDispatcher = Dispatcher.CurrentDispatcher;
如果这不能解决问题,那么您也可以尝试异步运行原始方法:
public void DataObjectPastingEventHandler(object sender, DataObjectPastingEventArgs e)
{
Dispatcher.BeginInvoke((Action)delegate()
{
MessageBox.Show("Hello");
}, null);
}
如果 仍然无法正常工作,那么我想出了所有想法...我会找到其他地方从{。}}启动。< / p>
答案 1 :(得分:0)
就像你们中的一些人说的那样,使用Dispatcher这更直接
Dispatcher.BeginInvoke((Action)delegate(){
MessageBox.Show("Cannot Paste ...");
}, null);