如何一起启用/禁用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"属性。为了同时支持这两种类型,我们必须为这两种类型组合一个命令,或者使用反射。两种解决方案都侵犯了简单继承所带来的优雅。