2017-07-06 16 views
1

メインフォームのスタイル値をダイアログボックスに渡す簡単な方法があるかどうかは不思議でした。c#WinForms - メインウィンドウのスタイルをダイアログボックスに渡す

私のアプリケーションには、すべての異なるコントロールタイプに対してユーザーが設定できるスタイルプロパティがあります。 ForeColor,BackColor、ボタンForeColor、ボタンBackColor、ボタンFlatStyleなど。私は、ダイアログボックスが同じ、一貫したスタイルを共有したい。

現時点では、これらのプロパティのそれぞれをこのようなダイアログボックスに渡します。
(この例では、より簡単なダイアログ形式のいずれかを示し、いくつかは、複数の制御タイプと、より多くのスタイルプロパティを持っている)

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace MyApplication 
{ 
    public partial class ConfirmDialog : Form 
    { 
     public Color ButtonBackColour { private get; set; } 
     public Color ButtonForeColour { private get; set; } 
     public FlatStyle ButtonFlatStyle { private get; set; } 

     public string Message { private get; set; } 
     public ConfirmDialog() 
     { 
      InitializeComponent(); 
     } 

     private void ConfirmDialog_Load(object sender, EventArgs e) 
     { 
      buttonYES.ForeColor = ButtonForeColour; 
      buttonCancel.ForeColor = ButtonForeColour; 

      buttonYES.BackColor = ButtonBackColour; 
      buttonCancel.BackColor = ButtonBackColour; 

      buttonYES.FlatStyle = ButtonFlatStyle; 
      buttonCancel.FlatStyle = ButtonFlatStyle; 

      lblMsg.Text = Message; 
     } 
    } 
} 

[OK]を、今私は、ダイアログ初期化子を保持するために使用する静的クラスを持っています。

​​

そして最後に、これは私が含まれる必要があり、引数の混乱です...

private void buttonDelete_Click(object sender, EventArgs e) 
{ 
    if (ShowDialog.ConfirmDialog("Are you sure you want to delete...?", this.ForeColour, this.BackColour, buttonDelete.BackColour, buttonDelete.ForeColour, buttonDelete.FlatStyle))// any button from main form will do 
    { 
     // Delete stuff... 
    } 
} 

静的クラスが冗長である場合、私はわからないですが、それは時に物事が非常に簡単になりますダイアログボックスがマウントを開始します。

これらの個々のスタイルプロパティをすべて渡す必要はなく、よりクリーンな方法があるかどうか疑問に思っていました。私はForm.Styleプロパティがないことを知っています。私はそれを作ることができると思います。しかし、私は何かが欠けているかどうかをGurusと最初に確認したいと思っていました。

+1

既に静的なクラスが用意されているので、ButtonBackColour、ButtonForeColourなどのすべてのプロパティを保持しておくことができます。あなたのフォームでそれらを定義し、すべてのダイアログにそれらを渡すのではなく、あなたのダイアログとあなたのフォームの両方のためにそれらを使用してください。 –

+0

@ElementalPete私はそれが好きです!なぜそれを答えとして追加しないのですか? – n00dles

+0

完了! upvoteありがとう:) –

答えて

1

この目的のために静的クラスがすでに定義されているので、そこにスタイルプロパティをホストし、フォームとダイアログの両方からそれらを参照できます。

using System.Drawing; 
using System.Windows.Forms; 

namespace MyApplication 
{ 
    public static class ShowDialog 
    { 
     public static Color ForeColour { get; set; } 
     public static Color BackColour { get; set; } 
     public static Color ButtonBackColour { get; set; } 
     public static Color ButtonForeColour { get; set; } 
     public static FlatStyle ButtonFlatStyle { get; set; } 

     public static bool ConfirmDialog(string message) 
     { 
      bool confirm = false; 
      using (ConfirmDialog Dialog = new ConfirmDialog() 
      { 
       Message = message, 
       ForeColor = this.ForeColour, 
       BackColor = this.BackColour, 
       ButtonBackColour = this.ButtonBackColour, 
       ButtonForeColour = this.ButtonForeColour, 
       ButtonFlatStyle = this.ButtonFlatStyle 
      }) 
      { 
       DialogResult dr = Dialog.ShowDialog(); 
       if (dr == DialogResult.Yes) 
       { 
        confirm = true; 
       } 
       else 
       { 
        confirm = false; 
       } 
      } 
      return confirm; 
     } 
    } 
} 

ときにアプリが起動しますが、これらのプロパティを設定することができ、そして、あなたのConfirmDialogメソッドにすべてのこれらの追加のパラメータを渡す必要がないが、あなたのことが可能になるだけでなく、これを実現するために、あなたの静的クラスは、より多くの、このようになりそれぞれのフォームで個別に定義するのではなく、すべてのフォームからそれらを参照することもできます。これにより、スキンを適用したい場合や後で変更する必要がある場合にも、単一の場所でスタイルを管理することが容易になります。

2

[formname] .designer.csのメインフォームのすべてのプロパティがpublic staticsであることを確認し、showdialogでは次のように呼び出すことができます。フォームがForm1の場合、this.ForceColor = Form1 .ForceColorはそれらのプロパティが実際にパブリックな静的なものであることです

+0

それは自動的に適応されます – CorrupD

+0

こんにちは、回答ありがとうございます。たとえば、 'private Panel panel1'をpublic staticに変更し、designer.csの他のすべてを変更することを意味しますか?なぜなら私はそれを行うことで '[formname] .ForeColor'をどのように設定/取得できるのか分からないからです。 – n00dles

+0

メインフォームのプロパティはここでは作成されません。値は 'フォーム。[プロパティ]'に割り当てられます。だから私はどうすればそれらを公的統計にすることができますか? – n00dles

0

エレメンタルピートの答えを読んだ後、私はアプリケーションの負荷として設定することができ、静的プロパティを作成すると考えられますが、代わりに新しいパブリッククラスを作成し、ShowDialog静的クラスに追加する、と、メインフォームのスタイルを更新するINotifyPropertyChangedを実装スタイルのプロパティが変更された後、メインフォームにパブリック静的インスタンスが作成されます。こうすることで、どこからでも[mainformname] .Styleのプロパティを取得または設定できます。プログラミングのベストプラクティスはほとんど分かりませんが、これは私が必要とするすべてのことを行う良いアプローチのようです。以上の

public class DisplayStyle : INotifyPropertyChanged 
    { 
     private Color foreColor; 
     private Color backColor; 

     //Buttons 
     private Color buttonForeColor; 
     private Color buttonBackColor; 
     private FlatStyle buttonFlatStyle; 
     private FlatButtonAppearance buttonFlatAppearance; 

     //ComboBoxes 
     private Color comboForeColor; 
     private Color comboBackColor; 
     private FlatStyle comboBoxFlatStyle; 

     //TextBoxes 
     private Color textBoxForeColor; 
     private Color textBoxBackColor; 

     //CheckBoxes 
     private Color checkBoxForeColor; 
     private Color checkBoxBackColor; 
     private FlatStyle checkBoxFlatStyle; 
     private FlatButtonAppearance checkBoxFlatAppearance; 

//...public properties, InotifyPropertyChanged Implementation etc... 

[mainformname] ...

public static DisplayStyle Style = new DisplayStyle(); 

これは私が考えられてきただけで、別のアプローチです。

0

メインフォームのスタイルを格納してアプリケーションの他のフォームに渡すもう1つの方法が見つかりました。今回は、内蔵のUser Propertiesを利用しています。

公式クラスの静的インスタンスに値を保存するのではなく、Properties.Settingsに値を保存して、ユーザーのApplication Dataフォルダに.configファイルを作成します。これはmy other approachとほぼ同じです。 Reset(),Reload()Save()のメソッドとプロパティ更新イベントを使用すると、非常に便利です。

私は設定タブで必要なすべてのプロパティを作成できます(または実行時に作成できます)。
それでは、私は、プロパティ値を編集することができます

Properties.Settings.Default.FormForeColour = newColour; 

と編集が発生すると、フォームに適用します:

Properties.Settings.Default.PropertyChanged += new PropertyChangedEventHandler(UserSettings_PropChanged); 

private void UserSettings_PropChanged(object sender, PropertyChangedEventArgs e) 
{ 
    //update the form's display properties 
    //e.g. 
    this.ForeColor = Properties.Settings.Default.FormForeColour; 

    labelStatus = e.PropertyName + " successfully updated"; 
} 

私は、ダイアログボックスを作成するたびだから、私は単純にスタイルプロパティを設定することができます

using (ConfirmDialog Dialog = new ConfirmDialog() 
{ 
    Message = message, 
    this.ForeColor = Properties.Settings.Default.FormForeColour, 
    this.BackColor = Properties.Settings.Default.FormBackColour, 
    this.ButtonBackColour = Properties.Settings.Default.ButtonBackColour, 
    this.ButtonForeColour = Properties.Settings.Default.ButtonForeColour, 
}) 
関連する問題