如何从另一种形式调用多个方法C#

问题描述 投票:1回答:3

我有多个表单,使用相同的方法称为“UpdateTheme”,它改变了表单的背景颜色。我希望能够从另一种形式调用所有这些方法。

我尝试使用“UpdateTheme”方法创建一个基本表单,然后让所有其他表单继承自基本表单,但我不知道如何/是否可以从单独的“设置”调用派生表单方法的每个实例形成。

public abstract class CustomForm : Form
{
    public void UpdateTheme(string theme)
    {
        if (theme == "dark")
        {
            this.BackColor = Color.Black;
        }
        else if (theme == "light")
        {
            this.BackColor = Color.White;
        }
    }
}

在设置表单中我会有类似的东西

public void btnSetThemeToDark_Click(object sender, EventArgs e)
{
    foreach (instance of derived form)
    {
        derivedForm.UpdateTheme("dark");
    }
}

什么是最好的方法呢?

c# forms winforms visual-studio
3个回答
3
投票

您可以创建一个名为StyleManager的单例,其中包含全局样式属性。这个单例有一个名为样式更改的事件,可以由所有表单或基本表单处理。因此,您的所有表单都从一个来源获取信息。

的StyleManager

public class StyleManager
{

#region singleton

public static StyleManager Instance { get; } = new StyleManager();
private StyleManager()
{
}

#endregion

#region events

public event EventHandler StyleChanged;

private void OnStyleChanged()
{
  this.StyleChanged?.Invoke(this, EventArgs.Empty);
}

#endregion

#region properties

public Color BackColor { get; set; }

#endregion

#region methods

public void UpdateBackColor(Color color)
{
  this.BackColor = color;
  this.OnStyleChanged();
}

#endregion
}

并在您的表单中使用它:

public Form()
{
  this.InitializeComponent();
  //Attach to the event
  StyleManager.Instance.StyleChanged += this.StyleChanged;
}

//Handle event
private void StyleChanged(object sender, EventArgs eventArgs)
{
  this.BackColor = StyleManager.Instance.BackColor;
}

//set backcolor of all forms
StyleManager.Instance.UpdateBackColor(Color.Yellow);

0
投票

假设这个表单是表单的MdiChildren,你可以这样做:

foreach (var form in this.MdiChildren)
{
    var castedForm = form as CustomForm;
    if (myObjRef != null)
    {
         castedForm.UpdateTheme("dark");
    }        


}

此功能超出主题,适用于子表单的任何常用方法。


0
投票

我不认为这是最好的方法。但是,您可以使用此代码存档您想要的内容。

CustomForm mainFrm = (CustomForm)Application.OpenForms["YouCustomFormNameHere"];
mainFrm.UpdateTheme("dark");

将'YouCustomFormNameHere'替换为您的CustomForm表单名称。

© www.soinside.com 2019 - 2024. All rights reserved.