【问题标题】:How to call multiple methods from another form C#如何从另一个窗体 C# 调用多个方法
【发布时间】:2018-07-06 17:08:24
【问题描述】:

我有多个表单,使用名为“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");
    }
}

最好的方法是什么?

【问题讨论】:

  • 如果您已经在某处跟踪打开的表单,则可以让每个实例在您打开它时订阅“theme_changed”事件,并从点击处理程序中引发该事件。
  • 非常感谢。我现在试试。
  • 还有Application.OpenForms,它已经包含了这样一个列表。另请参阅stackoverflow.com/q/26308602/1132334,其中使用OfType 解决了仅影响“派生”表单的要求
  • 我添加了一个像你和feal建议的事件。工作得很好。我并不是说要求只处理派生形式,我只是建议我自己的问题的可能答案。

标签: c# forms winforms visual-studio


【解决方案1】:

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

样式管理器

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

【讨论】:

  • 非常感谢。工作得很好。我不太确定该怎么做,很高兴你很好地解释了我的问题。
【解决方案2】:

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

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


}

此功能适用于主题之外的任何子表单的常用方法。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2022-01-23
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多