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

C# 如何在WinForms中通过自制控件创建事件?,c#,.net,winforms,C#,.net,Winforms,我正在做我的第一个C#和.NET项目,该项目使用WinForms,因为WPF对于我们来说是一种过分的手段。我创建了一个所谓的ButtonMenu,它由所有菜单点组成,这些菜单点都是按钮。此类派生自Windows类控件 ButtonMenu的其中一个按钮是“Culture”(区域性)按钮,当在这个单触式应用程序中按下该按钮时,该按钮将更改应用程序所有表单的语言 最初,ButtonMenu只是一种覆盖类,它访问BaseForm的控件并包含方法。基本表单将按钮放在自己的GroupBox中。后来,我遇到

我正在做我的第一个C#和.NET项目,该项目使用WinForms,因为WPF对于我们来说是一种过分的手段。我创建了一个所谓的ButtonMenu,它由所有菜单点组成,这些菜单点都是按钮。此类派生自Windows类控件

ButtonMenu的其中一个按钮是“Culture”(区域性)按钮,当在这个单触式应用程序中按下该按钮时,该按钮将更改应用程序所有表单的语言

最初,ButtonMenu只是一种覆盖类,它访问BaseForm的控件并包含方法。基本表单将按钮放在自己的GroupBox中。后来,我遇到了这种设计的问题,并决定对其进行单独的控制

我的问题 我如何创建一个事件(或类似事件),它可以被BaseForm捕获,ButtonMenu就放在这里?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!

        […]
    } 
公共类基表单:表单
{
[…]
受保护的静态按钮菜单m_ButtonMenu=null;
受保护的覆盖void OnResize(事件参数e)
{
[…]
m_ButtonMenu=ButtonMenu.GetInstance(m_CurrentCulture,Size);
m_ButtonMenu.Visible=true;
[…]
}
public override void UpdateWidgets()
{
[…]
尝试
{
[…]
//将按钮菜单转换为当前语言:
m_按钮菜单适应按钮(m_CurrentCulture);
}
捕获(ArgumentOutOfRangeException aaore)
{
[…]
[…]
}
受保护的void InitializeWidgets()
{
{
字符串strMethod=Name+“:InitializeWidgets():”;
m_ButtonMenu=ButtonMenu.GetInstance(m_CurrentCulture,Size);
SuspendLayout();
控件。添加(m_按钮菜单);
m_ButtonMenu.Top=高度-m_ButtonMenu.Height;
恢复布局();
[…]
m_ButtonMenu.Click+=new System.EventHandler(this.ButtonMenu CultureClick);
}
私有无效按钮菜单文化单击(对象发送者,事件参数eas)
{
int iSelection=listViewMessages.SelectedIndices[0];//只需在类中定义一个

只要你想让它开火,就叫它

// field
event EventHandler somethingHappened;

// in a method:
var threadSafeCopy = somethingHappened;
if(threadSafeCopy != null)
{ 
  threadSafeCopy(this, e);
}
其中,
e
EventArgs
的实例或
EventArgs
的子类型,只需在类中定义一个

只要你想让它开火,就叫它

// field
event EventHandler somethingHappened;

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

其中,
e
EventArgs
的一个实例,或者是
EventArgs
的一个子类型,可惜你没有使用WPF。这本来是很容易的。我只是对你关于WPF是“滥杀滥伤”的假设开了一部分玩笑并提出质疑太遗憾了,你没有使用WPF。这本来很容易。我只是部分地嘲笑和质疑你关于WPF是“过度杀伤力”的假设我可以通过MSDN站点上的教程来解决我的问题。我发现由于之前的考虑,我的事件发布者类ButtonMenu是一个单例,不再需要了。因此,我将其修改为一个普通的控制类。我添加了MSDN站点上的所有内容,它工作正常!我可以通过MS站点上的教程来解决我的问题DN at.我发现由于之前的考虑,我的名为ButtonMenu的事件发布器类是一个单例,不再需要了。因此,我将其修改为一个普通的控件类。我添加了MSDN站点中的所有内容,它工作正常!