none
wpf 制作弹出菜单 RRS feed

  • 问题

  • WPF中,我想在鼠标点击一个Button后,在Button上方弹出一个菜单,这些菜单最好能和这个Button的样式相似。请问这个功能该怎么实现啊?
    勿以恶小而为之,勿以善小而不为
    2009年8月23日 10:51

答案

  • 在WPF里弹出菜单是用Popup,你那个右键的是上下文菜单(也就是快捷菜单)。

    Xaml:

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MainWindow" Width="300" Height="300">
        <Button x:Name="BtnPop" Width="100" Height="30" HorizontalAlignment="Left" VerticalAlignment="Bottom" Content="Popup"/>
        <Popup x:Name="Pop" PopupAnimation="Slide" Width="100" Height="100" PlacementTarget="{Binding ElementName=BtnPop}" Placement="Top" AllowsTransparency="True" StaysOpen="False">
            <Border Background="#FFCFCFCF" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="1">
                <StackPanel Margin="5">
                    <Button Content="A" Margin="5"/>
                    <Button Content="B" Margin="5"/>
                    <Button Content="C" Margin="5"/>
                </StackPanel>
            </Border>
        </Popup>
    </Window>

    BtnPop按钮的Click事件为:Pop.IsOpen = True。

    补充一点:
    可以将BtnPop的LostFocus事件设置为:Pop.IsOpen = False,以此来关闭Popup。

    再补充一点:
    如果你希望Popup中的按钮像ContextMenu中的那样,也就是不要按钮效果,可以自定义一个Button的Style。然后把Popup中的按钮的Style都换成自定义的这个Style。
    2009年8月24日 6:03

全部回复

  • WPF中,我想在鼠标点击一个Button后,在Button上方弹出一个菜单,这些菜单最好能和这个Button的样式相似。请问这个功能该怎么实现啊?
    勿以恶小而为之,勿以善小而不为
    补充:这个菜单项可能不止一个。而且是要左键响应。为什么在WPF版块发帖没人问津啊?

    勿以恶小而为之,勿以善小而不为
    2009年8月23日 13:02
  • 不是无人问津,而是你这个问题和上一个交互的问题描述的实在是有些叫人摸不着头脑。比如这里你所说的菜单和按钮的样式相似是什么意思呢?菜单的样式怎么可能和按钮一样呢?一般在WPF里样式是指控件的Style设置,你指的是这个么?另外,菜单项不止一个,且是左键响应是什么意思呢?一般的菜单不都是多项的,左键点击选项的么?难道你要的不是一个普通的菜单?还有你说的这个上方指的又是什么呢?是按钮的上下左右的上,还是在按钮前面(也就是上面)后面(也就是下面)的这个上。如果你是想用Popup做菜单的话(一般都是用这个做),这有一个Popup放置行为的说明(http://msdn.microsoft.com/zh-cn/library/bb613596.aspx)。
    2009年8月23日 16:26
  • 一般的菜单项你添加的时候都是在屏幕上方啊。现在我要的是这个菜单刚开始的时候没有。在鼠标点击我界面里一个BUTTON后,在这个BUTTON上方显示出来这个菜单。用右键是这样做的:
           <Button Width="100" Height="50">
                <Button.ContextMenu>
                    <ContextMenu>
                        hello,world!
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>
    现在要点击左键在Button上面弹出菜单。
    勿以恶小而为之,勿以善小而不为
    2009年8月24日 0:42
  • 在WPF里弹出菜单是用Popup,你那个右键的是上下文菜单(也就是快捷菜单)。

    Xaml:

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MainWindow" Width="300" Height="300">
        <Button x:Name="BtnPop" Width="100" Height="30" HorizontalAlignment="Left" VerticalAlignment="Bottom" Content="Popup"/>
        <Popup x:Name="Pop" PopupAnimation="Slide" Width="100" Height="100" PlacementTarget="{Binding ElementName=BtnPop}" Placement="Top" AllowsTransparency="True" StaysOpen="False">
            <Border Background="#FFCFCFCF" CornerRadius="5" BorderBrush="#FF000000" BorderThickness="1">
                <StackPanel Margin="5">
                    <Button Content="A" Margin="5"/>
                    <Button Content="B" Margin="5"/>
                    <Button Content="C" Margin="5"/>
                </StackPanel>
            </Border>
        </Popup>
    </Window>

    BtnPop按钮的Click事件为:Pop.IsOpen = True。

    补充一点:
    可以将BtnPop的LostFocus事件设置为:Pop.IsOpen = False,以此来关闭Popup。

    再补充一点:
    如果你希望Popup中的按钮像ContextMenu中的那样,也就是不要按钮效果,可以自定义一个Button的Style。然后把Popup中的按钮的Style都换成自定义的这个Style。
    2009年8月24日 6:03
  • 恩。十分感谢。
    勿以恶小而为之,勿以善小而不为
    2009年8月24日 12:32