如何使自定义按钮显示菜单

7
我在WPF中有一个自定义按钮,出于样式原因,我希望将其用作我的主菜单按钮。我正在尝试创建类似于Microsoft Office 2007的菜单。我已将菜单项添加到按钮中,但是当我单击按钮时,没有菜单打开。事实上,我收到了编译器错误,提示Content设置了太多次。我认为这可能与我的图像有关。我需要添加或更改哪些其他代码才能使它在单击时实际打开菜单并且没有错误呢?
这是我现在在我的按钮下拥有的内容:
<!--- MAIN MENU BUTTON -->
        <Button Width="50"
        Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top">
            <!--- MAIN MENU BUTTON IMAGE -->
            <Button.Content>
                <StackPanel Orientation="Horizontal">
                    <Image
                        Source="..." 
                               Width="40"
                               Height="40" />
                </StackPanel>
            </Button.Content>
            <!-- MENU COMMAND -->
            <Menu>
                <MenuItem x:Name="MainMenu">
                    <MenuItem Header="New" />
                    <MenuItem Header="Open" />
                    <MenuItem Header="Exit" Click="Exit_Click" />
                </MenuItem>
            </Menu>
         </Button>

我读过一些关于绑定的例子,但我不确定在这种特定情况下如何实现绑定。

谢谢。


1
您确定不需要 MenuItem 吗?http://msdn.microsoft.com/zh-cn/library/system.windows.controls.menuitem.aspx - paparazzo
在你的情况下,MenuStackPanel之外,所以会出现错误。在内容中,如果包含多个元素,则它们必须全部位于面板(StackPanelGrid等)中。但是为什么我的回答对你来说不合适呢? - Anatoliy Nikolaev
好的,这就更接近了。我从未说过它不适合。我只是认为它与ContextMenu有点相关,而不仅仅是MenuItems。看起来我开始尝试设置一个ContextMenu时出了点意外。 - Eric after dark
让我看一下。抱歉,在它能正常工作之前,我不会接受答案。 - Eric after dark
我明白了,我只是以为你需要其他东西。在办公室、歌剧院等地方,按下一个按钮就会出现“ContextMenu”。这是一个标准的“Menu”控件,通常是水平的,“ContextMenu”则是垂直的。 - Anatoliy Nikolaev
显示剩余2条评论
1个回答

15
您可以使用RoutedEvent Button.Click来显示ContextMenu:
<Button Name="MainButton" Content="Button with ContextMenu" Width="150" Height="30">
    <Button.ContextMenu>
        <ContextMenu x:Name="MainContextMenu" PlacementRectangle="{Binding RelativeSource={RelativeSource Self}}">
            <MenuItem Header="Main">
                <MenuItem Header="Find" />
                <MenuItem Header="Add" />
                <MenuItem Header="View" />
                <MenuItem Header="Edit" />
            </MenuItem>
        </ContextMenu>
    </Button.ContextMenu>

    <Button.Triggers>
        <EventTrigger SourceName="MainButton" RoutedEvent="Button.Click">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MainContextMenu" Storyboard.TargetProperty="(ContextMenu.IsOpen)">
                        <DiscreteObjectKeyFrame KeyTime="0:0:0">
                            <DiscreteObjectKeyFrame.Value>
                                <sys:Boolean>True</sys:Boolean>
                            </DiscreteObjectKeyFrame.Value>
                        </DiscreteObjectKeyFrame>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Button.Triggers>
</Button>

输出

enter image description here

注意:像这样添加sys命名空间:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

到你的 Window

<Window x:Class="ShowContextMenu.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="525" .../>

我收到了“sys”是未声明的命名空间。XML无效。”和“找不到类型'sys:Boolean'。请确认您没有丢失程序集引用...” - Eric after dark
好的,唯一的问题是,一旦我打开菜单并点击其他地方,"Main"框仍然保持打开状态。 - Eric after dark
对我来说,它不会关闭,甚至在我切换窗口时仍然保持打开状态。 - Eric after dark
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/33506/discussion-between-anatoliy-nikolaev-and-eric-after-dark - Anatoliy Nikolaev
@AnatoliyNikolaev 我正在尝试使用完全相同的东西,但是出现了一个异常,说找不到MainContextMenu。我正在使用DevExpress SimpleButton而不是用于皮肤的按钮,但我认为它没有链接。你有任何想法吗? - J4N
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接