2010-11-30 7 views
1

Winformsを使用して、古いVB6プロジェクトをC#に移植しています。オリジナルは、DataDynamicのActiveBarスイートを使用して、ツールバー、メニュー、ショートカットリボンの複数の項目の変更を同時に管理します。すべての古いコードは、いくつかのメニュー、ツールバー、およびコンテキストメニュー間で共有される項目のテキストを変更するために行う必要がありますが、 "ツール"オブジェクトの "Caption"プロパティを変更します。メニューとツールバーの間でToolStripMenuItemを共有する方法はありますか?

.NETのように感じるはさまざまなコンテナの間でToolStripItemを共有する何らかの方法がありますが、そうではありません。何か不足していますか?

現在、私は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

0

SharedMenuItemを実装しました。これは変更が必要なUI要素を登録して更新することでした。コンテキストメニューは、独自のハンドラを保証するのに十分なほど異なっています。

すべてのMenuItemを更新する代わりに、私はSharedMenuItemを更新しましたが、それは他の変更を処理しました。

[EDIT]コード(他のプロパティを追加することも、自動的に生成可能/簡単です):

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

興味深い...コードを表示/共有する! :-) –

+0

しかし、設計上の観点から、技術的に言えば、異なるメニューのアイテム - 同時に表示されるアイテムは、最終的に同じアクションを指していますが、実際には異なるアイテムです。 –

+0

はい、別のアイテムですが、常にプロパティのセットを共有する必要があります(完璧な "オブザーバー"パターンの機会ですが、これは上記のものです)。 – Crisfole

関連する問題