4

非常に単純でわかりやすい例です。

窓があります。RoutedUICommandの実行をキャッチするようにCommandBindingsが設定されています。

<Window
   ...
   >
   <Window.CommandBinding>
       <CommandBinding 
           Command="{x:Static local:Commands.Command1}"  
           Executed="OnCommand1Executed" 
           CanExecute="OnCanCommand1Execute" 
           />
   </Window.CommandBinding>
</Window>

ウィンドウでホストされているUserControlがあり、その中でContextMenuが宣言されています。ContextMenuアイテムには、同じRoutedUICommandに割り当てられたCommandプロパティがあります。

<ContextMenu>
    <MenuItem Command="{x:Static local:Commands.Command1}" />
</ContextMenu>

ただし、メニュー項目は非アクティブのままです(==無効)。どういうわけか、コマンドの実行はウィンドウに上がらない。多分それはContextMenuがポップアップの中にあるからですか?

必要なCommandBindingをContextMenu.CommandBindingsコレクションに追加すると、すべてが正しく機能します。しかし、それは単一の「グローバル」CommandBindingの場所を持たないというひどいオプションです。

どうすれば最善の方法で問題を解決できますか?

UPD:それほど悪くはないことがわかりました。コマンドは、ユーザーが最初にメニューを開いたときにのみバインドされません。閉じて再度開いた場合は、すべて問題ありません。それでも、それは望ましくなく、かなり奇妙な振る舞いのようです。

4

2 に答える 2

4

Focus()を追加した場合でも、これは発生しますか?InitializeComponent();の直後 Windowsコンストラクターで?

これは、WPFでコンテキストメニューからビジュアルツリーを見つける際に問題が発生しているようです。メインウィンドウにフォーカスを設定すると、修正される場合があります。

于 2009-06-07T19:55:17.210 に答える
1

ユーザーコントロールでこの問題をどのように処理できますか?そのコンテキストではフォーカスが機能しないようです

更新:ここで解決策を見つけましたContextMenu内でMenuItemのCommandTargetを設定する方法は?

CommandTargetに関連しているようです

<MenuItem x:Name="mnuProperties" Header="_Properties"
          Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}"
          CommandTarget="{Binding PlacementTarget,
          RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/>
于 2009-08-22T16:19:09.347 に答える