簡體   English   中英

帶有ContextMenu的WPF按鈕

[英]WPF Button with ContextMenu under left click

我的ContextMenu有小問題。

<Window.Resources>
    <Style x:Key="ButtonWithContextMenuStyle" TargetType="Button">
        <Setter Property="Background" Value="#cbeb00" />
        <Setter Property="Foreground" Value="#505050" />
        <Setter Property="FontSize" Value="12" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border CornerRadius="4" Background="{TemplateBinding Background}"
                            BorderThickness="0">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="#aaaaaa"/>
                            <Setter Property="Foreground" Value="#dcff00"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <MenuItem Command="{Binding EditUserCommand}" Header="{DynamicResource EditUserContextMenuMW}"/>
                    <MenuItem Command="{Binding OpenHistoryCommand}" Header="{DynamicResource ConversationHistoryContextMenuMW}"/>
                    <MenuItem Command="{Binding OpenHistoryCommand}" Header="{DynamicResource BuyCreditContextMenuMW}"/>
                    <Separator />
                    <MenuItem Command="{Binding LogoutCommand}" Header="{DynamicResource LogoutContextMenuMW}"/>
                </ContextMenu>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="Click" >
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                            </BooleanAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

當我單擊鼠標右鍵時,一切正常。 ContextMenu打開,我可以在MenuItem上調用Command。

當我單擊鼠標左鍵時,我希望看到相同的行為。 但是,只有ContextMenu打開,並且我不能調用Command。

有人可以告訴我我在做什么錯嗎?

<Window x:Class="ContextMenuMouseDownStack.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<StackPanel Margin="10">
    <StackPanel.Resources>
        <Style TargetType="Button">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:2" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Resources>
    <Button Content="Click!" VerticalAlignment="Center" HorizontalAlignment="Center">
        <Button.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Menu item 1" Click="MenuItem_Click"/>
                <MenuItem Header="Menu item 2" />
                <Separator />
                <MenuItem Header="Menu item 3" />
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</StackPanel>

在與您的示例類似的示例中,Click事件將按預期方式執行任務。 確實,我那里沒有Command,但在處理程序后面有一個簡單的代碼。 它可以通過鼠標左右鍵兩種方式到達。 僅用於測試,您可以在那里嘗試一個簡單的處理程序嗎?

更新1:

它對我也有兩種作用:

<EventTrigger RoutedEvent="PreviewMouseDown">

更新2

似乎您的分鏡腳本正在破壞事物:

我已經通過以下彈出窗口更改了它:

    <Popup x:Name="btnMenuPopup" Placement="Mouse" StaysOpen="False">
        <Border BorderBrush="Black" BorderThickness="2" CornerRadius="2">
            <Menu>
                <MenuItem Header="Menu item 1" Command="{Binding EditCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
                <MenuItem Header="Menu item 2" />
                <Separator />
                <MenuItem Header="Menu item 3" />
                <Menu.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </Menu.ItemsPanel>
            </Menu>
        </Border>
    </Popup>

為了快速起見,我在按鈕上添加了一個click事件,它將打開彈出窗口。

 private void Button_Click(object sender, RoutedEventArgs e)
 {
   btnMenuPopup.IsOpen = true;
 }

現在應該可以了。

這是彈出命令:

  Command="{Binding CommandShowPopup}" CommandParameter="{Binding ElementName=btnMenuPopup}"

命令執行:

public class CommandShowPopup : ICommand
{
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        (parameter as Popup).IsOpen = true;
    }
}

您需要使用MouseRightButtonDown路由事件。

<EventTrigger RoutedEvent="MouseRightButtonDown">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM