C# 如何在WinForms中通过自制控件创建事件?
我正在做我的第一个C#和.NET项目,该项目使用WinForms,因为WPF对于我们来说是一种过分的手段。我创建了一个所谓的ButtonMenu,它由所有菜单点组成,这些菜单点都是按钮。此类派生自Windows类控件 ButtonMenu的其中一个按钮是“Culture”(区域性)按钮,当在这个单触式应用程序中按下该按钮时,该按钮将更改应用程序所有表单的语言 最初,ButtonMenu只是一种覆盖类,它访问BaseForm的控件并包含方法。基本表单将按钮放在自己的GroupBox中。后来,我遇到了这种设计的问题,并决定对其进行单独的控制 我的问题 我如何创建一个事件(或类似事件),它可以被BaseForm捕获,ButtonMenu就放在这里?BaseForm当前无法对此事件做出反应,并且无法更改其所有控件(如文本字段和按钮)的语言 谢谢你的帮助 我迄今为止所做的尝试如下所示。不幸的是,我无法到达标记线C# 如何在WinForms中通过自制控件创建事件?,c#,.net,winforms,C#,.net,Winforms,我正在做我的第一个C#和.NET项目,该项目使用WinForms,因为WPF对于我们来说是一种过分的手段。我创建了一个所谓的ButtonMenu,它由所有菜单点组成,这些菜单点都是按钮。此类派生自Windows类控件 ButtonMenu的其中一个按钮是“Culture”(区域性)按钮,当在这个单触式应用程序中按下该按钮时,该按钮将更改应用程序所有表单的语言 最初,ButtonMenu只是一种覆盖类,它访问BaseForm的控件并包含方法。基本表单将按钮放在自己的GroupBox中。后来,我遇到
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站点中的所有内容,它工作正常!