0

추상 팩토리 패턴을 사용하여 사용자 지정 가능한 "테마"로 폼 응용 프로그램을 만들려고합니다. 나는이 같은 테마 팩토리의 구현을 만들었습니다Windows 폼 컨트롤을 동적으로 생성하기

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 Forms 디자이너에서 만들어 졌음에도 불구하고 InitializeComponent() 메서드는 완전히 정상적인 것으로 편집 할 수 있습니다. 이 파일은 *.Designer.cs (여기에서 *은 클래스 이름 임) 파일에 있습니다.

이 메서드에는 구성 요소에 대한 모든 생성자 호출이 포함되어 있지만이 메서드를 팩토리 메서드 호출로 바꿀 수 있습니다. 이렇게하면 Windows Forms 디자이너를 사용하여 레이아웃을 편집 할 수 없지만 디자이너에서 수행 할 수있는 모든 작업은 *.Designer.cs* 파일의 코드를 편집하여 수행 할 수 있습니다. 난 단지 버튼을 구현

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; 
     }) {} 
} 

이 예제에서 :

0

그것이 내가 할 노력 무엇을 달성하기 위해 공장을 사용하는 것은 불가능 듯, 나는 반복적으로 그들을 통해 반복하여 기존 구성 요소의 스타일을 결정 하지만, 모든 구성 요소의 스타일은 쉽게 추가하고, 테마를 사용하는 것처럼 쉽게 할 수있다 :이 작동하지만이 초기 질문에 설명, 공장과 달성 등이 될 것입니다 경우

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

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

, 나는 여전히 궁금 .