Winform 自定義控制元件設計模式下使用DesignMode不進行依賴注入
阿新 • • 發佈:2018-12-10
系統定義了一個基類控制元件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;
}
}