Dispatcher在Textchanged事件中的Messagebox.Show上抛出InvalidOperationException

时间:2011-09-16 09:52:32

标签: c# wpf custom-controls

首先,这是我的错误

上的错误日志条目

crash program @ 15-9-2011 15:01:30error:System.InvalidOperationException: Dispatcher processing has been suspended, but messages are still being processed. at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

无论如何代码:

private void TB_postcode_cijfers_TextChanged(object sender, TextChangedEventArgs e){
if (TB_postcode_cijfers.Text != string.Empty || TB_postcode_cijfers.Text.Length > 0)
{
    LBL_postcode.Content = Postcode_cijfers + Postcode_letters;
    if (TB_postcode_cijfers.Text.Length == 4 && TB_postcode_letters.Text.Length == 2)
    {
        if (!ZoekOpPostcode(Injectioncheck(TB_postcode_cijfers.Text + TB_postcode_letters.Text)))
        {
            //MessageBox.Show("Geen resultaat gevonden, " + errortext);
            if (MessageBox.Show("Geen resultaat gevonden, " + errortext + ".\n Wilt u overschakelen naar handmatig? ", "Handmatig?", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                RB_handmatig.IsChecked = true;
            }
            else
            {
                //
            }
        }
    }
}}

所以在messagebox.show方法上。 这只发生在用户在表单上将读取模式切换到编辑模式时。 这涉及折叠显示一些标签和ui控件。

如果事件从userinput触发,一切都很好。 我想知道的是: 为什么隐藏和显示一些控件时会触发textchanged事件。 我该怎么做才能防止这个错误?

编辑: 上面的代码是在自定义的wpf控件中。放在winforms项目/表格中

1 个答案:

答案 0 :(得分:22)

请参阅此thread,它描述了与您相同的问题:

  

异常是为了防止由于引起的重入错误而完成的   改变视觉树所产生的怪异,同时也是这样的事件   (它本身是由视觉树改变引发的)是   射击。如果你真的必须在状态时确认一下   UI元素发生变化,可能会延迟Dispatcher.BeginInvoke   正确的做法。

要在UI线程上运行代码,请执行以下操作:

 Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
     {

        if (MessageBox.Show("Geen resultaat gevonden, " + errortext + ".\n Wilt u overschakelen naar handmatig? ", "Handmatig?", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
        {
            RB_handmatig.IsChecked = true;
        }
        else
        {
            //
        }
    }));