2010-11-30 43 views
1

我正在使用Winforms將舊的VB6項目移植到C#。原始使用DataDynamic的ActiveBar套件同時管理工具欄,菜單和快捷功能區中的多個項目的更改。所有的舊代碼都必須改變在幾個菜單,工具欄和上下文菜單之間共享的項目的文本是改變「工具」對象的「標題」屬性。有沒有辦法在菜單和工具欄之間共享ToolStripMenuItem?

我覺得像.NET 必須有不同容器之間共享ToolStripItem s的方式,但它看起來並不像。我錯過了什麼嗎?

目前我已經有各種想法多次啓動,從ToolStripMenuItem對象實施Clone擴展方法,並有我的形式跟蹤每個共享的。當我意識到更新本地副本不會更新其他人時(我不得不添加更復雜的更新事件,而不是簡單地手動打開和關閉每個項目),失敗了。我考慮過創建一些基於標籤來更新所有項目的方法。這似乎也是不可行的。

你們都在類似的情況下使用過什麼技術?

回答

3

好吧,這其實是淨GUI構建庫

一種常見的解決方法是動態地管理你的菜單的煩人的限制之一,將項目添加到他們,因爲他們正在打開。從用戶體驗的角度來看,它很難但很完美。 訣竅是使用下面的UI設計pradigm:菜單從不同時顯示,這樣你就可以使用標誌和代碼邏輯,你就可以知道,作爲菜單/熱插拔項目

private void myContextMenuStrip_Opening(object sender, CancelEventArgs e) 
{ 
    myContextMenuStrip.Items.Insert(3, myToolStripMenuItem); 
} 

ToolBar/ContextMenu被打開,它應該顯示哪些項目。

+0

「菜單從不同時顯示」並不完全正確考慮到我們都有`Toolbar`歸類用`Menu`和`ContextMenu`。 – Crisfole 2010-12-01 19:29:05

0

我結束了實施SharedMenuItem的職責是註冊和更新需要更改的UI元素。上下文菜單不同,足以保證自己的處理程序。

而不是更新所有MenuItems我更新SharedMenuItem,然後負責其他更改。

[編輯]代碼(添加其它性質是微不足道/自動-可生成的偶數):

public class SharedMenuItem 
{ 
    bool enabled = false; 
    public bool Enabled 
    { 
     get { return enabled; } 
     set 
     { 
      enabled = value; 
      foreach (var member in members) 
      { 
       member.Enabled = value; 
      } 
     } 
    } 

    bool visible; 
    public bool Visible 
    { 
     get { return visible; } 
     set 
     { 
      visible = value; 
      foreach (var member in members) 
      { 
       member.Visible = visible; 
      } 
     } 
    } 

    string text; 
    public string Text 
    { 
     get { return text; } 
     set 
     { 
      text = value; 
      foreach (var member in members) 
      { 
       member.Text = text; 
      } 
     } 
    } 

    string toolTipText = ""; 
    public string ToolTipText 
    { 
     get { return toolTipText; } 
     set 
     { 
      toolTipText = value; 
      foreach (var member in members) 
      { 
       member.ToolTipText = toolTipText; 
      } 
     } 
    } 

    private List<ToolStripItem> members = new List<ToolStripItem>(); 

    public void Remove(ToolStripItem member) 
    { 
     members.Remove(member); 
    } 

    public void Add(ToolStripItem member) 
    { 
     members.Add(member); 
    } 

    public SharedMenuItem(string text) 
    { 
     this.text = text; 
    } 
} 
+0

有趣...顯示/分享您的代碼! :-) – 2010-12-04 07:08:25

相關問題