1

クリックすると ContextMenu が表示されるボタンがあります。この ContextMenu には、MenuItems があります。MenuItem が左クリックされた場合、コマンドを実行する必要があります。この動作はすべて、現在、次のコードで適切に機能します。

<Button.ContextMenu>
    <ContextMenu>
        <ContextMenu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                 <Setter Property="Command" Value="{Binding StartContextMenuCommand}" />
                 <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
            </Style>
        </ContextMenu.ItemContainerStyle>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.1}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.2}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.3}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.4}"/>
    </ContextMenu>
</Button.ContextMenu>

ここで、各メニュー項目に 1 つの MenuItem を含むコンテキスト メニューが必要です。左クリックすると MenuItem の Command が呼び出されるため、右クリックの動作で次の ContextMenu を表示する必要があります。

<ContextMenu>
      <MenuItem Header="Set Default"></MenuItem>
</ContextMenu>

これをItemContainerStyleのセッターとして入れてみました。また、MenuItem の ContextMenu として配置しようとしましたが、どちらの試みもうまくいきませんでした。これを行うハックな方法を思いつくことができると確信していますが、クリーンでシンプルに保ちたいと思っています。

4

2 に答える 2

0

多分私はあなたの質問を理解していません (私の英語は...特別なものではありません):Dしかし、マルチレベルのコンテキストメニューが必要な場合は、これでうまくいくはずです:

<ContextMenu>
    <MenuItem Header="Top Level 1">
        <MenuItem Header="Sub Level" />
        <MenuItem Header="Sub Level" />
    </MenuItem>
    <MenuItem Header="Top Level 2">
        <MenuItem Header="Sub Level" />
        <MenuItem Header="Sub Level" />
    </MenuItem>
</ContextMenu>
于 2013-07-20T08:51:57.137 に答える
0

これがこの問題に対する私の現在の修正ですが、私はそれがまったく好きではありません。コードビハインドはできるだけ避けたい。

<ContextMenu.ItemContainerStyle>
      <Style TargetType="{x:Type MenuItem}">    
          <Setter Property="Command" Value="{Binding StartCommand}" />
          <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
          <Setter Property="ContextMenu"> 
             <Setter.Value>
                <ContextMenu StaysOpen="True">
                    <MenuItem Header="Set As Default"/>
                </ContextMenu>
             </Setter.Value>
          </Setter>
          <EventSetter Event="PreviewMouseRightButtonUp" Handler="MenuItem_Click"/>
      </Style>
</ContextMenu.ItemContainerStyle>

そして背後にあるコード:

 private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        ButtonContextMenu.StaysOpen = true;
        (sender as MenuItem).ContextMenu.IsOpen = true;
    }
于 2013-07-22T21:31:39.103 に答える