1

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

.NET には、さまざまなコンテナー間で sを共有する何らかの方法が必要だと思いますToolStripItemが、そうではないようです。何か不足していますか?

Clone現在、オブジェクトに拡張メソッドを実装しToolStripMenuItemたり、フォームに各共有可能ファイルを追跡させたりするなど、さまざまなアイデアから始めました。ローカル コピーを更新しても他のコピーが更新されないことに気付いたとき、これは失敗しました (単純に各項目を手動でオン/オフするよりも複雑な更新イベントを追加する必要があります)。タグに基づいてすべてのアイテムを更新する何らかの方法を作成することを検討しました。それもかなり無理のようでした。

同様の状況で、皆さんはどのようなテクニックを使用しましたか?

4

2 に答える 2

3

まあ、これは実際には.Net GUI-Building Librariesの厄介な制限の1つです

一般的な回避策は、メニューを動的に管理し、開いているアイテムをメニューに追加することです。見苦しいですが、ユーザー エクスペリエンスの観点からは非常にシームレスです。秘訣は、次の UI デザイン プラダイムを使用することです。メニューは同時に表示されないため、アイテムをホットスワップできます。

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

次に、フラグとコード ロジックを使用して、Menu/ToolBar/ContextMenu が開かれているときに、どの項目を表示するかを知ることができます。

于 2010-12-01T18:18:41.173 に答える
0

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

すべてのMenuItemを更新する代わりに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;
    }
}
于 2010-12-03T21:14:54.160 に答える