2013-07-29 70 views
0

我目前正在研究一個包含多個項目的大型解決方案。WinForm覆蓋多個項目中的.ShowDialog()

多種形式予使用form.ShowDialog();from.Show(); (形式而不是形式的名稱)

我提出使用被刺線程加載屏幕。

所以我需要重載每form.Show()form.ShowDialog()來實現這個新功能。

我在谷歌搜索了幾個小時,但找不到任何有用的東西。 我自己嘗試了不同的變化。 但不能弄清楚。

有沒有辦法在解決方案中重載表格Show()ShowDialog()

+0

你想超載你的'ShowDialog'和'Show'? –

+0

'Show'之前我想在第二個線程中顯示加載屏幕 – BramVdeventer

+0

好的,我明白你想要什麼,請看我的答案。 –

回答

0

一個可能的解決方案是讓您的表單來自自定義基類,該自定義基類將覆蓋默認功能Show()ShowDialog()。這意味着你需要找到任何兩種方法中使用的任何表單並實現這個功能。例如

創建實現形式的自定義類:從該形式,例如

public class CustomForm : Form 
{ 
    public DialogResult ShowDialog() 
    { 
     throw new NotImplementedException(); 
    } 
} 

導出

public partial class Form2 : CustomForm 
{ 

} 

稱呼它,

form2.ShowDialog(); 
+0

如果從'System.Windows.Forms.Form'類型調用基類方法 –

+0

@SriramSakthivel,這仍然會調用base方法您在這個事實中是正確的 - 這就是爲什麼我的解決方案是從自定義基類型派生。 –

+0

從自定義類型派生也不會幫助時,轉換爲'窗體'類型並調用'ShowDialog'的權利?在你的回答中最好提及的是我的意見 –

0

使用一些深奧的Win32調用,有可能鉤這些方法。但是,你將會遠離.NET的領域,並且解決方案會比它的價值更復雜。我推薦以下兩種東西之一:

  1. 創建一個派生自Form的基類。新的基類將包含ShowShowDialog方法的新聲明(使用new關鍵字隱藏底層的Form成員)。添加新的邏輯,並在適當時調用原始的Form.Show/Form.ShowDialog。讓您的應用程序中的每個表單都來自您的新基類。
  2. 添加一個靜態工具方法(或擴展方法),它可以完成上面基類中的相同工作。
0

解決方案中的每種表單都從您編寫的自定義類繼承,然後繼承自Form。如果在這個「中間」類中重寫.Show和.ShowDialog,它將應用於所有將它分類的表單。這仍然需要您觸摸解決方案中的每個表單文件,但這是以多種形式實現通用代碼的正確方法。

0

添加到您的CS的頂端文件

using ext; 

namespace ext 
{ 
    public static class extensions 
    { 
     public static DialogResult ShowDialog(this Form form, string title) 
     { 
      DialogResult ret; 


      form.Text = title; 

      ret = form.ShowDialog(); 

      return ret; 
     } 
    } 
} 

這將重載所有形式的ShowDialog()函數來參加,並顯示該對話框時,設置窗體標題。

private void form(object sender, EventArgs e) 
{ 
    this.ShowDialog("My new title"); 
} 
0

我認爲這裏是最乾淨的解決方案。我知道你的項目中有很多不方便重新組織的形式(例如讓他們繼承相同的表格類,並且覆蓋該類中的ShowShowDialog)。此解決方案需要您只須要hookinsert代碼顯示了形成之前執行的形式Handle訪問:

public class FormWndProc : NativeWindow { 
    protected override void WndProc(ref Message m){ 
     if(m.Msg == 0x18&&m.WParam != IntPtr.Zero)//WM_SHOWWINDOW = 0x18 
     { 
     //your code here 
     //you can use m.HWnd to get the Handle of the form 
     } 
     base.WndProc(ref m); 
    } 
} 
//use the class 
//suppose you want to execute the code before showing the form1, form2, form3 
new FormWndProc().AssignHandle(form1.Handle); 
new FormWndProc().AssignHandle(form2.Handle); 
new FormWndProc().AssignHandle(form3.Handle); 
//you can save the instance of FormWndProc to call the ReleaseHandle() method later if you don't want to insert code before showing the form. 

如果您可以訪問您的形式,我的意思是你可以直接在覆蓋方法WndProc,你可以這樣做:

public class Form1 : Form { 
    ///.... 
    protected override void WndProc(ref Message m){ 
     if(m.Msg == 0x18&&m.WParam != IntPtr.Zero)//WM_SHOWWINDOW = 0x18 
     { 
     //your code here 
     //you can use m.HWnd to get the Handle of the form 
     } 
     base.WndProc(ref m); 
    } 
} 
//This way you don't need the class FormWndProc as defined above.