1

選択できる項目 (MenuItem) を持ついくつかのサブメニューを持つ ContextMenu があります。ContextMenu を開いたときに、現在選択されている項目を再帰的に開きたい。だから、私は次のコードを持っています:

    protected override void OnOpened( RoutedEventArgs e ) {
        base.OnOpened( e );
        OpenCurrentSubMenu( Items );
    }

    private static bool OpenCurrentSubMenu( ItemCollection itemCollection ) {
        foreach (MenuItem item in itemCollection) {
            if (item.IsChecked) {
                return true;
            }
            else if( OpenCurrentSubMenu( item.Items ) ) {
                item.IsSubmenuOpen = true;
                return true;
            }
        }
        return false;
    }

また、1 つの項目のみがチェックされるようにする他のコードもあります。

これは、サブメニューでアイテムを初めて選択したときにうまく機能するようです. ContextMenu を再度開くと、開いているサブメニューがカスケードして、選択した項目に開きます。

最初のドロップダウン

ただし、コンテキスト メニューを離れてもう一度開くと、選択したメニューが開きません。

次のドロップダウン

誰かがそれを修正する理由と方法を知っていますか?

4

4 に答える 4

3

次の 3 つのことを試してください。

  • コンテキスト メニューが開いている場合は、サブメニューを開こうとする前に、階層全体を再帰して IsSubmenuOpen = false に設定します。以前に開いていたサブメニューが記憶されているため、同じレベルで 2 つのサブメニューを開くように指示しようとしている可能性があります。

  • 再帰的に開く必要のあるサブメニューを見つけてリストに保存します。次に、リストを反復処理して、子サブメニューが開く前に一番上のメニューが開くように設定します。(親がまだ開いていないときに子を開こうとすると、常に確実に機能するとは限りません)。

  • 厄介なブルート フォース アプローチ: コンテキスト メニューが開かれるたびに削除して再作成します。良いことではありませんが、コンテキスト メニューを開こうとすると、パフォーマンスへの影響が心配になるでしょう。そして、それは初めて機能するように見えるので、毎回最初に作成してください。

于 2011-11-23T15:40:05.293 に答える
1

falseに戻す前に、値を に設定すると役立つ場合がありますtrue。私はこれを確認することはできません。

item.IsSubmenuOpen = false;
item.IsSubmenuOpen = true;
于 2011-11-23T01:11:49.053 に答える
0

メニュー項目がチェックされているときはロジックがうまく機能するはずですが、サブメニュー項目がチェックされているときはそうではありません。私の意見では、2 つのループを試してください。1 つはメニュー用、もう 1 つはサブメニュー項目用です。

于 2011-11-23T01:26:47.917 に答える