1. 程式人生 > >Winform 自定義控制元件設計模式下使用DesignMode不進行依賴注入

Winform 自定義控制元件設計模式下使用DesignMode不進行依賴注入

系統定義了一個基類控制元件BaseControl,該類實現控制元件的通用方法以及進行依賴注入

public partial class BaseControl : UserControl
{
    //依賴注入的實體類
    public TestClass testClass{ get; set; }
    
    //依賴注入的方法
    public void InitInjection()
    {
        //to do init injection
    }
}

子類控制元件TestControl繼承基類控制元件BaseControl

public class TestControl : BaseControl
{
    //to do ...
}

當介面拖拽TestControl到介面或者開啟設計檢視時,會在介面的designer.cs檔案中生成依賴注入的實體類的例項化方法

//TestForm.Designer.cs檔案
public class TestForm
{
    ...
    
    private void InitializeComponent()
    {
        TestClass testClass = new TestClass();

        ...
    }
}

解決方案:

  通過系統System.ComponentModel.Component下的DesignMode來控制開啟設計檢視或者拖拽控制元件時,不進行依賴注入

public partial class BaseControl : UserControl
{
    public void InitInjection()
    {
        if(!DesignMode)
        {
            //to do init injection
        }
    }
}

除錯時發現,BaseControl中的DesignMode仍為False,這裡引用一位哥們的總結:“也就是說一個控制元件只有在它自己被拖拽到設計器的時候,其 DesignMode 才是真,如果它被包含在其他控制元件中被加入到設計器,那麼那個控制元件才是在設計模式,而它不是!換句話說,DesignMode 並不能反映當前環境是否是執行時,它只能告訴你,這個控制元件當前是不是直接被設計器操作(巢狀的已經不算了) 。”

因而需要對DesignMode進行重寫,使之符合我們的期望值

protected new bool DesignMode
{
      get
      {
            bool returnFlag = false;
#if DEBUG
            if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime)
                returnFlag = true;
            else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToUpper().Equals("DEVENV"))
                returnFlag = true;
#endif
            return returnFlag;
        }
}