如何一起启用/禁用MenuItem和ToolButton
时间:2020-03-06 14:38:55 来源:igfitidea点击:
我是Cbu的新手,我是经验丰富的Delphi开发人员。
在Delphi中,我可以使用TAction.OnExecute事件对MenuItem和ToolButton使用相同的代码,并且可以使用TAction.OnUpdate事件一起禁用/启用MenuItem和ToolButton。
在不使用外部库的情况下,有没有类似的方法可以做到这一点?或者更多开发人员如何在不同控件之间共享代码?
好吧,可能是我以错误的方式写了我的问题。我不想知道不使用巫婆属性(我知道已启用属性),但是我想知道在巫婆事件上是否应该启用/禁用多个控件,我应该添加该属性。在delphi中,当Application空闲时,发生TAction.OnUpdate事件。C#中是否存在类似事件?
解决方案
我们可以通过设置控件的"启用"属性来启用或者禁用该控件及其所有子控件。
我们可以将MenuItem和ToolButton的代码挂在同一处理程序中。例如:
menuItem.Click + = HandleClick;
工具栏按钮。点击+ = handleClick;
这样,同时单击MenuItem和Button将执行相同的代码并提供相同的功能。
尝试对命令模式进行修改:
public abstract class ToolStripItemCommand { private bool enabled = true; private bool visible = true; private readonly List<ToolStripItem> controls; protected ToolStripItemCommand() { controls = new List<ToolStripItem>(); } public void RegisterControl(ToolStripItem item, string eventName) { item.Click += delegate { Execute(); }; controls.Add(item); } public bool Enabled { get { return enabled; } set { enabled = value; foreach (ToolStripItem item in controls) item.Enabled = value; } } public bool Visible { get { return visible; } set { visible = value; foreach (ToolStripItem item in controls) item.Visible = value; } } protected abstract void Execute(); }
为了支持视图状态,此命令的实现可以是有状态的。这也使我们能够在表单中建立"撤消"功能。这是一些消耗代码的玩具代码:
private ToolStripItemCommand fooCommand; private void wireUpCommands() { fooCommand = new HelloWorldCommand(); fooCommand.RegisterControl(fooToolStripMenuItem, "Click"); fooCommand.RegisterControl(fooToolStripButton, "Click"); } private void toggleEnabledClicked(object sender, EventArgs e) { fooCommand.Enabled = !fooCommand.Enabled; } private void toggleVisibleClicked(object sender, EventArgs e) { fooCommand.Visible = !fooCommand.Visible; }
HelloWorldCommand:
public class HelloWorldCommand : ToolStripItemCommand { #region Overrides of ControlCommand protected override void Execute() { MessageBox.Show("Hello World"); } #endregion }
不幸的是,Control和ToolStripItem没有共享公共接口,因为它们都具有" Enabled"和" Visible"属性。为了同时支持这两种类型,我们必须为这两种类型组合一个命令,或者使用反射。两种解决方案都侵犯了简单继承所带来的优雅。