WinForm在多个项目中覆盖.ShowDialog()

时间:2013-07-29 14:30:45

标签: c# winforms overloading

我目前正在开发一个包含多个项目的大型解决方案。

我使用form.ShowDialog();from.Show();的许多表单 (表单名称而不是表单)

我使用有线程做了一个加载屏幕。

所以我需要重载每个form.Show()form.ShowDialog()来实现这个新功能。

Iv在谷歌搜索了几个小时,但我找不到任何有用的东西。 我自己尝试了不同的东西。 但是无法弄清楚这一点。

有没有办法在解决方案中重载每个表单Show()ShowDialog()

5 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使表单派生自自定义基类,该基类覆盖Show()ShowDialog()的默认功能。这意味着您需要找到用于这两种方法之一的任何表单并实现此功能。 e.g。

创建一个实现表单的自定义类:

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

从该表格中获取,例如

public partial class Form2 : CustomForm
{

}

来电,

form2.ShowDialog();

答案 1 :(得分:0)

使用一些深奥的Win32调用,可能会挂钩这些方法。但是,你要远远超出.NET领域,并且解决方案将比它的价值更复杂。我推荐以下两种方法之一:

  1. 创建一个派生自Form的基类。新基类将包含ShowShowDialog方法的新声明(使用new关键字隐藏基础Form成员)。添加新逻辑并在适当时调用原始Form.Show / Form.ShowDialog。让您的应用程序中的每个表单都来自您的新基类。
  2. 添加一个静态实用程序方法(或扩展方法),它执行与上面基类相同的操作。

答案 2 :(得分:0)

让解决方案中的每个表单都继承自您编写的自定义类,然后继承自Form。如果在这个“中间”类中覆盖.Show和.ShowDialog,它将应用于对其进行子类化的所有表单。这仍然需要您触摸解决方案中的每个表单文件,但这是在多种表单中实现公共代码的正确方法。

答案 3 :(得分: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");
}

答案 4 :(得分:0)

我认为这是最干净的解决方案。我知道您的项目中有许多表单不方便重新组织(例如让它们从同一表单类继承并覆盖该类中的ShowShowDialog)。此解决方案要求您在显示该表单之前,只能访问要Handlehook代码执行的表单的insert

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.