在Pastinghandler WPF中显示MessageBox

时间:2014-06-24 14:28:08

标签: c# wpf event-handling

我有一个对话框,用户可以在其中编辑某些字段。有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?

2 个答案:

答案 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);