模态弹出窗口失败 - CSHARP WPF

问题描述:

批量上传多个文件,有一个CSHARP WPF代码的一个部分,我有哪些生成线程,允许文件的上传平行。 如果上传发生错误,则会使用MessageBox弹出消息。这工作正常。模态弹出窗口失败 - CSHARP WPF

但现在最近我们已经决定自定义消息框的外观。我发现当我们新的自定义WPF MessageBox窗口用ShowDialog()打开时,抛出一个错误,说它不可能启动一个GUI。只有当派生线程的代码尝试打开自定义消息窗口时才会发生这种情况 - 当自定义MessageBox从主线程打开时,我没有看到问题。

我的临时修复是捕获自定义对话框启动时发生的任何错误,或者调用标准的MessageBox.Show()来显示消息。这样可行。

我不知道为什么它是确定使用标准MessageBox.Show(),但它不是自定义窗口。有没有办法解决这个问题?

一般而言(在任何GUI,API)不从工作线程调用GUI功能,不这样做的GUI线程繁重的工作。 标准MessageBox在工作线程上工作的事实令人伤心。

是的,你是完全正确的。当你的工作者线程发生需要向用户显示的事情时,发送一个通知(信号,事件,无论你的框架调用它)到GUI线程并在那里显示消息。

+1

Hyperboreus是正确的。原因在于几乎没有UI API被构建为线程安全的,因此尝试在非UI线程上执行UI任务通常会导致难以发现线程问题。例如,WinForms已添加代码以检测此问题,并在尝试使用非UI线程中的控件方法时引发异常。当一个对象绑定到一个特定的线程时,它被称为具有线程亲和性。 – Andy 2011-05-23 20:50:41

+0

好的 - 谢谢。但这可能不是我希望的答案:) – George 2011-05-23 21:43:06

 Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate { 
      // show your MB here 
     }, null); 

protected void chkAll_CheckedChanged(object sender, EventArgs e) 
    { 
     CheckBox chall = (CheckBox)sender; 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      CheckBox chSelect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      if (chSelect != null) 
      { 
       chSelect.Checked = chall.Checked; 
      } 
     } 
    } 
    protected void chkSelect_CheckedChange(object sender, EventArgs e) 
    { 
     int i=0; 
     CheckBox chkAll = (CheckBox)GridView1.HeaderRow.FindControl("chkAll"); 
     for (i = 0; i < GridView1.Rows.Count; i++) 
     { 
      CheckBox chkSelect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      if(chkSelect!=null && !chkSelect.Checked ) 
       if (chkAll != null) 
       { 
        chkAll.Checked = false; 
       } 
      break; 
     } 
     if (GridView1.Rows.Count == i && chkAll != null) 
     { 
      chkAll.Checked = true; 
     } 

    } 
    protected void ddlPaymentMode_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddlpaymode = (DropDownList)sender; 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      Label lblpaymode = (Label)GridView1.Rows[i].FindControl("lblPayAmt_Mode"); 
      CheckBox chpaymode = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      if (chpaymode.Checked) 
      { 
       lblpaymode.Text = ddlpaymode.SelectedItem.Text; 
      } 
     } 
    } 
    protected void ddlBankName_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddlBank = (DropDownList)sender; 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      CheckBox cselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      Label lblBankName = (Label)GridView1.Rows[i].FindControl("LblBank"); 
      if (cselect.Checked) 
      { 
       lblBankName.Text = ddlBank.SelectedItem.Text; 
      } 

     } 
    } 
    protected void btnaddbpc_Click(object sender, EventArgs e) 
    { 
     int temp = Convert.ToInt32(txtChequeNo.Text); 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      Label lblcheckno = (Label)GridView1.Rows[i].FindControl("LblCheque"); 


      if (chkselect.Checked) 
      { 

       lblcheckno.Text = Convert.ToString(temp); 
       temp++; 
      } 

     } 
    } 
    protected void dtnDelete_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      Label lblcheckno = (Label)GridView1.Rows[i].FindControl("LblCheque"); 


      if (chkselect.Checked) 
      { 
       lblcheckno.Text = ""; 
      } 

     } 
    } 
    protected void btnAddCDate_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      Label lblchqdate = (Label)GridView1.Rows[i].FindControl("LblCheque_Date"); 
      CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      if (chkselect.Checked) 
      { 
       lblchqdate.Text = TxtChequeDate.Text; 
      } 
     } 
    } 
    protected void btnRemovecDate_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < GridView1.Rows.Count; i++) 
     { 
      Label lblchqdate = (Label)GridView1.Rows[i].FindControl("LblCheque_Date"); 
      CheckBox chkselect = (CheckBox)GridView1.Rows[i].FindControl("ChkSelect"); 
      if (chkselect.Checked) 
      { 
       lblchqdate.Text = ""; 
      } 
     } 
    } 
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Modify") 
     { 
      string ID = e.CommandArgument.ToString(); 
      //Response.Redirect("Admin_Update_BinryPayment.aspx?id="+ID+"&FromDate='"+ txtfromdate.Text +"'&ToDate='"+txttilldate.Text+"'"); 
      int Index = ((GridViewRow)((LinkButton)e.CommandSource).Parent.Parent).RowIndex; 
      CheckBox chksec = (CheckBox)GridView1.Rows[Index].FindControl("ChkSelect"); 
      Label lblANo = (Label)GridView1.Rows[Index].FindControl("Label2"); 
      Label lbAName = (Label)GridView1.Rows[Index].FindControl("Label3"); 
      Label lbACName = (Label)GridView1.Rows[Index].FindControl("Label3"); 
      Label lbacNo = (Label)GridView1.Rows[Index].FindControl("lblBankAccountNo"); 
      Label lbBankName = (Label)GridView1.Rows[Index].FindControl("LblBank"); 
      Label lbchqNo = (Label)GridView1.Rows[Index].FindControl("LblCheque"); 
      Label lbchqDate = (Label)GridView1.Rows[Index].FindControl("LblCheque_Date"); 
      Label lblChqAmt = (Label)GridView1.Rows[Index].FindControl("Label23"); 
      if (chksec.Checked) 
      { 
       txtABNo.Text = GridView1.Rows[Index].Cells[3].Text;