【发布时间】:2021-11-07 07:58:56
【问题描述】:
我正在学习 C# 和 MVP。我能够处理简单的菜单点击事件。我正在尝试使用 MVP 模式处理菜单点击事件,但无法弄清楚它为什么不起作用。我在互联网上查看了很多代码并想出了以下内容。
interface IMenuBarView
{
event EventHandler AboutMenuItemClicked;
...
}
public partial class MenuBarView : UserControl, IMenuBarView
{
public event EventHandler AboutMenuItemClicked;
private MenuBarPresenter m_menuBarPresenter;
public MenuBarView()
{
this.aboutToolStripMenuItem.Click += AboutMenuItemClicked;
m_menuBarPresenter = new MenuBarPresenter(this);
}
}
class MenuBarPresenter
{
private IMenuBarView m_menuView;
public MenuBarPresenter(IMenuBarView menu)
{
m_menuView = menu;
m_menuView.AboutMenuItemClicked += AboutMenuItemClicked;
}
public void AboutMenuItemClicked(object sender, EventArgs e)
{
MessageBox.Show("Hello");
}
}
我可以在 MenuBarView 中有一个事件处理程序,然后它可以调用演示者来执行逻辑。但我更感兴趣的是做上面的那一项。这不是正确的做法吗? 我对 C# 真的很陌生,所以不要杀了我。 :)
编辑后: 我很快编造了一些我尝试按照@Enigmativity cmets 编译的东西。它运行但从未调用该事件。创建一个表单,添加一个菜单项并将菜单项名称命名为 item1ToolStripMenuItem。单击菜单时,不会触发该事件。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace testEventHandler
{
public partial class Form1 : Form, IMenuBarView
{
public event EventHandler AboutMenuItemClicked;
private MenuBarPresenter m_menuBarPresenter;
public Form1()
{
InitializeComponent();
this.item1ToolStripMenuItem.Click += AboutMenuItemClicked;
m_menuBarPresenter = new MenuBarPresenter(this);
}
}
interface IMenuBarView
{
event EventHandler AboutMenuItemClicked;
}
class MenuBarPresenter
{
private IMenuBarView m_menuView;
public MenuBarPresenter(IMenuBarView menu)
{
m_menuView = menu;
m_menuView.AboutMenuItemClicked += item1ToolStripMenuItem_Click;
}
private void item1ToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("hello");
}
}
}
【问题讨论】:
-
如果您发布的代码能够真正编译,那将非常有用,而且很高兴知道除此之外,“不工作”对您的实际代码意味着什么。
-
我想发布最少数量的代码,这样任何人都可以判断这是否是一个好代码。不工作意味着我没有在 AboutMenuItemClicked 中获得控件。
-
“我没有在 AboutMenuItemClicked 中获得控件”是什么意思?
-
另外,您应该发布minimal reproducible example。最少的代码是好的,只要它包含足以让我们看到您面临的问题的所有内容。