1

私は次のようなContextMenuの一部を持ってTabControlいます:

<TabControl Name="MyTabControl">
    <TabControl.ContextMenu>
        <ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True">
            <MenuItem Header="Item1"></MenuItem>
            ...
        </ContextMenu>
    </TabControl.ContextMenu>
</TabControl>

ご覧のとおり、メニューは無効になっています。プログラムの後半で有効になりますが、現時点では、無効な状態のままにしておく必要があります。問題は、右クリックしTabControlて無効なメニューが表示されると、最初に開いた場所に留まり、他の右クリックで移動したり、どこかを左クリックしても消えないことです。

それを取り除く唯一の方法は、それを有効にしてから右/左クリックするか、MyContextMenu.Visibility = Visibility.Collapsed/Hidden;

StaysOpen-property を に設定してみましたFalse。その後、メニューが一度無効な状態で開きます。左クリックすると消え、有効になっても再び表示されません。

これを回避する唯一の方法は、StaysOpen-property とともに -property を変更するIsEnabledことですが、メニューが無効な状態で一度だけ開き、その後は開かないというのは少し奇妙です。

誰かが私に説明してくれることを願っています.なぜ無効なメニューが閉じず、StaysOpenfalse のプロパティが一度だけ開くのか.

4

1 に答える 1

0

コンテキストメニュー項目の動作は非常に奇妙に思えます-あなたが説明したのは.Net 4.0であり、たとえばアプリを.Net 3.5にターゲットすると、反対の動作に気付くでしょう-メニューをそのままにすることはできません単一のアイテムが無効になっている場合に開くと、右クリックで表示された直後に消えます。

ただし、コンテキスト メニュー項目の有効状態 (およびそれが行うべき OnClick アクション) を管理するための好ましい方法は、Command.

まず、ビューの datacontext を指定する必要があります。それが class であるとしましょうViewModel.cs。次に、次のICommandようなインターフェイスを実装してコマンドを作成します。

public class MyCommand : ICommand

そして、そのCanExecute名前が言うことを正確に実行するメソッドがあります-コマンドを実行できるかどうかを決定します。また、メニュー項目の有効状態は、このメソッドの戻り値にも依存します。falseしたがって、必要な限りそれを返し続けることができ、メニューは正しく動作し、メニュー項目は無効になります。次に、必要に応じてtrue(メソッド自体のロジックによって)それを返すことができ、メニュー項目が有効になっている適切に機能するコンテキストメニューが再び表示されます。

メニュー全体を無効にする場合は、メニューに対して同じ方法を使用します。

また、メニュー内のすべての項目を無効にする必要がある場合 (メニュー全体とは異なると思います)、次のようなものを使用できます。

<TabControl Name="MyTabControl" Background="Green">
            <TabControl.ContextMenu>
                <ContextMenu Name="MyContextMenu"  StaysOpen="True" ItemsSource="{Binding  Items}">
                    <ContextMenu.ItemTemplate>
                        <DataTemplate >
                            <MenuItem Header="{Binding Header}"  IsEnabled="False" />
                        </DataTemplate>
                    </ContextMenu.ItemTemplate>
                </ContextMenu>
            </TabControl.ContextMenu>
        </TabControl> 

ここでItemsSource( Items) はたとえばList<MenuItem>であり、MenuItemitelw は各メニュー項目のモデル (MVVM で考える) にHeaderなり、各メニュー項目に表示するヘッダーを含むプロパティが必要です。IsEnabledダミーの例のようにtoを設定する代わりに、falseそれをプロパティにバインドして、いつ true および false にする必要があるかを制御できます。

于 2012-11-16T21:55:23.373 に答える