2008-09-24 19 views
0

我是C#bu的新手我有經驗的Delphi開發人員。 在德爾福我可以使用相同的代碼爲MenuItem和ToolButton使用TAction.OnExecute事件,我可以使用TAction.OnUpdate事件一起禁用/啓用MenuItem和ToolButton。 有沒有類似的方式來在C#中做到這一點,而無需使用外部庫?或者更多 - C#開發人員如何在不同控件之間共享代碼?如何一起啓用/禁用MenuItem和ToolButton


好的,可能是我寫錯了我的問題。我想知道不使用巫婆屬性(我知道Enabled屬性),但我想知道巫婆事件我應該附加到如果我想啓用/禁用多個控件。在delphi TAction.OnUpdate事件發生時,應用程序空閒 - 在C#中是否有類似的事件?

回答

0

您可以將MenuItem和ToolButton的代碼掛鉤在同一個處理程序中。例如:
menuItem.Click + = HandleClick;
toolbarButton.Click + = handleClick;
通過這種方式,同時單擊MenuItem和Button將執行相同的代碼並提供相同的功能。

+0

@Xline請不要隨意向人們問這樣的問題 - 不適合使用註釋 – Flexo 2014-11-20 09:53:53

1

嘗試命令模式的修改:

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 
} 

這是不幸的控制和ToolStripItem的不共享一個通用的接口,因爲它們都具有「啓用」和「可見」屬性。爲了支持這兩種類型,你必須爲兩者合成一個命令,或者使用反射。這兩種解決方案都侵犯了簡單繼承提供的優雅。

+0

您從不在RegisterControl方法中使用eventName參數。它的目的是? – 2009-10-14 10:36:10