2016-09-27 131 views
0

我正在嘗試使用抽象工廠模式創建一個可自定義的「主題」窗體應用程序(只是爲了獲得一些經驗)。我創建了一個主題 - 工廠的實現是這樣的:動態生成窗體窗體控件

private IThemeFactory _themeFactory; 

public Form1(IThemeFactory theme) 
{ 
    _themeFactory = theme; // e.g. new BlueTheme() 
    InitializeComponent(); 
} 

我的問題是::是否有辦法讓

public class BlueTheme : IThemeFactory 
{ 
    public Button CreateButton() => new BlueButton(); 
    // ... more controls here ... 
} 

現在,我通過我的Form的構造函數傳遞一個IThemeFactory實例我的表單使用IThemeFactory.CreateButton()方法來生成表單上的所有按鈕?

+0

我想在初始化之後用主題按鈕替換(映射)所有常規按鈕,但必須有更好的解決方案,對吧? –

回答

0

儘管由Windows窗體設計器創建,InitializeComponent()方法是完全正常的,可以編輯。它位於文件中:*.Designer.cs(其中*是您班級的名稱)。

該方法包含組件的所有構造函數調用,但您可以繼續並使用工廠方法調用替換這些構造函數。請注意,這可能會阻止您使用Windows窗體設計器編輯佈局,但是您可以在設計器中執行的所有操作都可以通過編輯*.Designer.cs*文件中的代碼來完成。

0

,因爲它似乎是不可能使用一個工廠要達到什麼我試圖做的,我決定通過他們遞歸循環樣式現有的組件:

public abstract class Theme 
{ 
    public delegate void ButtonStyler(Button button); 
    public ButtonStyler StyleButton { get; } 

    protected Theme(ButtonStyler styleButton) 
    { 
     StyleButton = styleButton; 
    } 

    // Apply this theme to all components recursively 
    public void Style(Control parent) 
    { 
     if (parent is Button) StyleButton((Button) parent); 
     foreach (Control child in parent.Controls) Style(child); 
    } 
} 

public class BlueTheme : Theme 
{ 
    public BlueTheme() : base(
     button => 
     { 
      button.BackColor = Color.DeepSkyBlue; 
      button.ForeColor = Color.White; 
      button.FlatStyle = FlatStyle.Flat; 
     }) {} 
} 

在這個例子中我只實現了按鈕但任何部件的造型可以很容易地,並用一個主題,非常容易:

public Form1(Theme theme) 
{ 
    InitializeComponent(); 
    theme.Style(this); 
} 

private static void Main() { 
    Application.Run(new Form1(new RedTheme())); 
} 

雖然這個作品,我還是好奇這是否會在最初的問題解釋說是有一個工廠實現,比如。