【问题标题】:How to make a custom button display a menu如何使自定义按钮显示菜单
【发布时间】:2013-07-15 18:23:42
【问题描述】:

我在 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>

我读过一些关于绑定的例子,但我不确定如何在这个特定的实例中做到这一点。

谢谢。

【问题讨论】:

  • 您确定不想要 MenuItem 吗? msdn.microsoft.com/en-us/library/…
  • 是的,我确定。我知道如何使用这些。我希望我的按钮充当菜单项。编辑:我明白你的意思。我已将代码从ContextMenu 更改为MenuItem。我现在遇到的唯一问题是编译器错误,因为显然MenuItem 不适用于&lt;Button.ContextMenu&gt;
  • 我改了代码,愚蠢的错误。
  • 在您的情况下,Menu 超出了StackPanel,因此您会收到错误消息。在内容中,如果包含多个元素,则它们必须都在面板中(StackPanelGrid 等)。但是为什么我给你的答案不合适呢?
  • 好的,距离更近了一点。我从来没有说过不合适。我只是认为它与 ContextMenu 的关系比 MenuItems 多一点。看起来我不小心开始尝试设置 ContextMenu。

标签: wpf button drop-down-menu


【解决方案1】:

您可以使用 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>

Output

Note: 像这样添加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'。确认您没有丢失程序集引用...”
  • 好的,唯一的问题是,一旦我打开菜单并单击其他地方,“主”框就会保持打开状态。
  • 对我来说,工作标准。在ContextMenu 之外单击将其关闭。
  • 对我来说,当我切换窗口时它不会关闭,甚至保持打开状态。
  • 您使用我的示例创建了一个 empty 项目,还是定义了其他内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多