c#WinForms - 将主窗口的样式传递给对话框

时间:2017-07-06 18:53:41

标签: c# winforms properties arguments

我只是想知道是否有更简单的方法将样式值从主窗体传递到对话框。

我的应用程序具有适用于所有不同控件类型的用户可设置样式属性; ForeColorBackColor,按钮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;
        }
    }
}

好的,现在我有一个静态类,用于保存对话框Initializers;

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

namespace MyApplication
{
    public static class ShowDialog
    {
        public static bool ConfirmDialog(string message, Color foreColour, Color backColour, Color buttonBackColour, Color buttonForeColour, FlatStyle buttonFlatStyle)// more style properties to come later on(flatstyle style props etc)
        {
            bool confirm = false;
            using (ConfirmDialog Dialog = new ConfirmDialog()
            {
                Message = message,
                ForeColor = foreColour,
                BackColor = backColour,
                ButtonBackColour = buttonBackColour,
                ButtonForeColour = buttonForeColour,
                ButtonFlatStyle = buttonFlatStyle
            })
            {
                DialogResult dr = Dialog.ShowDialog();
                if (dr == DialogResult.Yes)
                {
                    confirm = true;
                }
                else
                {
                    confirm = false;
                }
            }
            return confirm;
        }
    }
}

最后,这是我必须包括的一堆争论......

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属性。我想我可以创造一个。但是我想先和大师一起检查一下我是否遗漏了什么。

4 个答案:

答案 0 :(得分:2)

确保[formname] .designer.cs中主窗体的所有属性都是公共静态,在de showdialog中你可以用它们调用它们:如果你的窗体叫做Form1:this.ForceColor = Form1。 ForceColor是那些属性确实是公共静态

答案 1 :(得分: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 :(得分:0)

在阅读了Elemental Pete的回答之后,我考虑创建我可以在应用程序加载时设置的静态属性,但不是将它们添加到ShowDialog静态类,而是创建一个新的公共类,实现{{ 1}}更改样式属性时更新主窗体样式,然后在主窗体上创建公共静态实例。这样,我可以从任何地方获取或设置[mainformname] .Style的属性。我对编程中的最佳实践知之甚少,但这似乎是一种很好的方法,可以完成我需要的所有工作。

INotifyPropertyChanged

结束[mainformname] ......

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...

这只是我考虑的另一种方法。

答案 3 :(得分:0)

我找到了另一种方法来存储mainform的样式并将其传递给应用程序中的其他表单。这次,我正在使用内置的User Properties

它与my other approach几乎相同,只是将值保存到公共类的静态实例,而不是将值保存到Reset(),这会在用户的文件中创建.config文件Application Data文件夹。使用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,
})

因此,每当我创建一个对话框时,我只需从用户设置中设置样式属性:

<