c# - 单击IconButton后如何打开ContextMenu?

标签 c# wpf xaml mvvm

左键单击IconButton后,我需要打开ContextMenu。
我的按钮有以下代码:

<Controls:IconButton Visibility="{Binding IsFunctionalityVisible, Converter={StaticResource BooleanToVisibilityConverter}}"  Margin="0,0,0,0" Content="&#xf039;" ToolTip="Více možností">
              <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                  <cal:ActionMessage MethodName="OpenContextMenu">
                  </cal:ActionMessage>
                </i:EventTrigger>
              </i:Interaction.Triggers>
</Controls:IconButton>

问题是,我不能像这样使用ActionMessage,因为我不知道如何在ViewModel中创建函数“OpenContextMenu”。

我可以使用例如Pop-up代替ContextMenu(以某种方式将Pop-up添加到我的IconButton样式吗?)?

编辑:
这是我的IconButton风格:
<Style x:Key="IconButtonStyle" TargetType="{x:Type Button}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="{StaticResource ButtonForegroundColor}" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="{x:Type Button}">
      <Border  BorderThickness="0" Background="{TemplateBinding Background}" CornerRadius="0" SnapsToDevicePixels="true" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <ContentControl x:Name="ContentControl" Content="{TemplateBinding Content}" FontFamily="{StaticResource IconFont}" Margin="{TemplateBinding Padding}"  FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
      </Border>
      <ControlTemplate.Triggers>
        <Trigger Property="Button.IsDefaulted" Value="true">
        </Trigger>
        <Trigger Property="IsMouseOver" Value="true">
          <Setter Property="Foreground" TargetName="ContentControl" Value="{StaticResource ButtonForegroundActiveColor}"/>
        </Trigger>
        <Trigger Property="IsPressed" Value="true">
          <Setter Property="Foreground" TargetName="ContentControl" Value="{StaticResource ButtonForegroundActiveColor}"/>
        </Trigger>
      </ControlTemplate.Triggers>  
    </ControlTemplate>
  </Setter.Value>
</Setter>

编辑2:我想要ContextMenu像这样在单击最后一张图片上的蓝色IconButton之后(而不是右键单击之后)

I want ContextMenu like this

After clicking this IconButton

最佳答案

您可以通过使用Image的MouseDown事件来做到这一点,如下所示:

<Controls:IconButton ... MouseDown="Image_MouseDown">
<Controls:IconButton.ContextMenu>
    <ContextMenu>
        <MenuItem .../>
        <MenuItem .../>
    </ContextMenu>
</Controls:IconButton.ContextMenu>
</Controls:IconButton>

然后在后面的代码中在EventHandler中显示ContextMenu:
private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
    {
       e.Handled = true;
       Image image = sender as Image;
       ContextMenu contextMenu = image.ContextMenu;
       contextMenu.PlacementTarget = image;
       contextMenu.IsOpen = true;
    }
}

关于c# - 单击IconButton后如何打开ContextMenu?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762744/

相关文章:

c# - AutoResetEvent 和 Mutex 有什么区别

c# - 如何使用 MVVM、C# 和无代码隐藏将 Row 的文本动态设置为粗体?

WPF 用户控件数据绑定(bind)不起作用

.net - WPF:设置文本标签的透明度?

c# - 我的 UWP 应用无法读取 txt 文件

c# - 覆盖 RichEditBox 上的键盘快捷键?

c# - 流畅的多人游戏 Action

c# - 在 aspx 文件中包含 webservice 函数

c# - 在多线程(或 Web)c# 项目中使用静态属性的风险

wpf - 您可以限制 WPF TextBlock 中可见文本的长度吗?