我正在做我的第一个使用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!
[…]
}
在你的类中定义一个事件。
当你想让它开火时,调用它。
// field
event EventHandler somethingHappened;
// in a method:
var threadSafeCopy = somethingHappened;
if(threadSafeCopy != null)
{
threadSafeCopy(this, e);
}
其中e
为EventArgs
的实例或EventArgs
的子类型