0

TextBlock コントロールを含む多数の Borders を含む UserControl を作成しました。TextBlocks の Text プロパティは、ViewModel オブジェクトのデータに設定されています。

UserControl のリソースにいくつかのコンテキスト メニューを追加しました。

<UserControl.Resources>
    <ContextMenu x:Key="ContextMenu">
        <MenuItem Header="Copy Plate"   Command="cs:CarSystemCommands.CopyPlateCommand" />
        <MenuItem Header="Search Plate" Command="cs:CarSystemCommands.SearchPlateCommand" />
    </ContextMenu>
    <ContextMenu x:Key="TextBoxContextMenu">
        <MenuItem Header="_Copy"        Command="Copy" />
        <MenuItem Header="Copy Plate"   Command="cs:CarSystemCommands.CopyPlateCommand" />
        <MenuItem Header="Search Plate" Command="cs:CarSystemCommands.SearchPlateCommand" />
    </ContextMenu>
</UserControl.Resources>

コンテキスト メニューへの参照を TextBlocks に追加しました。次に例を示します。

<Border Background="#FFFFFF78" 
        BorderBrush="Black" 
        BorderThickness="2" 
        ContextMenu="{StaticResource TextBoxContextMenu}"
        Grid.Column="0" 
        Margin="5,10,5,5">
    <TextBlock FontSize="18" 
               FontWeight="Bold"
               HorizontalAlignment="Center" 
               Margin="5" 
               x:Name="Camera" 
               VerticalAlignment="Center" />
</Border>

最後に、CommbandBindings を UserControl に追加しました。

<UserControl.CommandBindings>
    <CommandBinding Command="Copy"                                  CanExecute="CopyCommand_CanExecute" Executed="CopyCommand_Executed" />
    <CommandBinding Command="cs:CarSystemCommands.CopyPlateCommand" CanExecute="CopyCommand_CanExecute" Executed="CopyPlateCommand_Executed" />
</UserControl.CommandBindings>

これまでのところ、これには2つの問題があります。

  1. コントロールを右クリックすると、メニューが表示されますが、選択肢がグレー表示されます。CopyCommand_CanExecute、CopyCommand_Executed、および CopyPlateCommand_Executed メソッドの先頭にブレークポイントを配置しました。これらのブレークポイントは、これまでのところ 1 回の実行でヒットしました。なぜ彼らがその時に攻撃されたのかはわかりませんが、それ以前もそれ以降もありません。CanExecute メソッドが毎回呼び出されるようにするにはどうすればよいですか?

  2. 一度ブレークポイントにヒットしたとき、引数の Source プロパティは、私が思っていたコントロールではなく、UserControl でした。UserControl のどの TextBlocks がイベントを発生させたかを知る必要があります。それ、どうやったら出来るの?

トニー

編集:

UserControl には、ComboBox コントロールも含まれています。ComboBox をドロップダウンした後に TextBlocks を右クリックすると、CanExecute メソッドが実行されることがわかりました。コンボボックスで何も選択する必要はありません。クリックするだけです。

私のコードではなく、ComboBox が何をしているのか考えてみませんか?

もう 1 つのことは、ComboBox をドロップダウンした後、Execute イベント引数の OriginalSource が ComboBox であることです。いくつかの TextBlocks で同じ Copy コマンドを使用したいのですが、どの TextBlock の Text をクリップボードにコピーするかを知るために、どのコンテキスト メニューが使用されたかを知る必要があります。ヘルプ!

4

2 に答える 2

0

私の問題に対する部分的な答えを見つけました。ContextMenu から実行された TextBlock の Copy コマンドをコードで判別できる方法を見つけました。このコマンドを必要とする 3 つの TextBlock に共通の ContextMenu を使用する代わりに、TextBlock ごとに個別の ContextMenu を作成しました。次に、その TextBlock の [コピー] メニュー項目に CommandParameter を追加し、コピーしたいプロパティの名前を付けました。次に、CopyCommand_Executed イベント ハンドラーで、e.Parameter 値の値を確認し、適切なコントロールの値をクリップボードにコピーします。これはうまくいきます。

ただし、ComboBox で何かを選択するまで CanExecute イベントが発生しないという問題が残っています。私はまだこれを理解する必要があります。

編集:

現在、CanExecute イベントを含め、すべてが正常に機能しているようです。何かを壊しているに違いないさまざまなことを試していましたが、CommandParameter が機能するようになったので、他のすべては問題ないようです。これを答えとしてマークします。

2 番目の編集:

実は、これを投稿したときに取り組んでいた UserControl ですべてが機能しています。しかし、まだ問題があります。

上記の UserControl は、実際には別の UserControl に埋め込まれています。最初の UserControl のコンテンツは StackPanel に含まれています。StackPanel を FocusScope として設定すると、すべてが機能し始めたようです。

2 番目のコントロールには、ルートに StackPanel があり、その中にいくつかのグリッドがあります。最初の Grid は、最初の UserControl とその他のものを保持します。その下の 2 番目のグリッドには、ContextMenus を持つ 2 つの DataGrid があります。現在機能していないのは、これらの ContextMenus です。

StackPanel を FocusScope にしました。最初の UserControl のコンテキスト メニューは、FocusScope にしない限り機能しません。最後に、2 つの DataGrid を保持する Grid を FocusScope にしました。

問題はFocusScopesに関係していると思いますが、それがどのように関係しているのかわかりません.また、私が試した組み合わせもありません. 何か案は?

于 2012-01-26T22:03:03.513 に答える