如何在WinForms中通过自制控件创建事件

本文关键字:控件 创建 事件 WinForms | 更新日期: 2023-09-27 18:16:39

我正在做我的第一个使用WinForms的c#和。net项目,因为WPF对于我们的目的来说是多余的。我创建了一个所谓的ButtonMenu,它包含所有菜单点,也就是按钮。这个类派生自Windows类Control。

按钮菜单中的一个按钮是"文化"按钮,当在这个单触式应用程序中按下该按钮时,应该会改变应用程序中所有表单的语言。

最初,ButtonMenu只是一种覆盖类,它访问BaseForm的控件和包含的方法。BaseForm将按钮保存在它自己的GroupBox中。后来,我遇到了这种设计的问题,并决定制作一个单独的控件。

我的问题我怎么能创建一个事件(或类似的东西),可以由BaseForm,其中按钮菜单放置捕获?BaseForm目前不能对该事件作出反应,也不能更改其所有控件的语言,例如文本字段和按钮。

谢谢你的帮助!

到目前为止我所尝试的如下所示。遗憾的是,我无法到达标记的线。

    public class BaseForm : Form
{
    […]
    protected static ButtonMenu m_ButtonMenu = null;

    protected override void OnResize(EventArgs e)
    {
        […]
        m_ButtonMenu = ButtonMenu.GetInstance(m_CurrentCulture, Size);
        m_ButtonMenu.Visible = true;
        […]
    }
    public override void UpdateWidgets()
    {
        […]
        try
        {
            […]
            // Translate button menu into current language:
            m_ButtonMenu.AdaptButtons(m_CurrentCulture);
        }
        catch (ArgumentOutOfRangeException aaore)
        {
        […]

        […]
    }
    protected void InitializeWidgets()
    {
    {
        string strMethod = Name + ":InitializeWidgets(): ";
        m_ButtonMenu = ButtonMenu.GetInstance(m_CurrentCulture, Size);
        SuspendLayout();
        Controls.Add(m_ButtonMenu);
        m_ButtonMenu.Top = Height - m_ButtonMenu.Height;
        ResumeLayout();
        […]
        m_ButtonMenu.Click += new System.EventHandler(this.ButtonMenu_CultureClick);
    }
    private void ButtonMenu_CultureClick(object sender, EventArgs eas)
    {
        int iSelection = listViewMessages.SelectedIndices[0];  // <<<<< NEVER REACHED!
        […]
    } 

如何在WinForms中通过自制控件创建事件

在你的类中定义一个事件。

当你想让它开火时,调用它。

// field
event EventHandler somethingHappened;
// in a method:
var threadSafeCopy = somethingHappened;
if(threadSafeCopy != null)
{ 
  threadSafeCopy(this, e);
}

其中eEventArgs的实例或EventArgs的子类型