像Windows 7中菜单选项卡上的按钮

时间:2011-12-07 00:26:50

标签: c# .net wpf xaml wpf-controls

我很好奇是否有人知道如何使用WPF在Windows 7资源管理器选项卡上执行下拉按钮(请参阅下面的Screeshot)。 enter image description here

4 个答案:

答案 0 :(得分:2)

我使用这个类,它看起来很棒: http://andyonwpf.blogspot.com/2006/10/dropdownbuttons-in-wpf.html

我会在这里发帖,所以阅读更清晰:

/// <summary>
/// Andy On WPF: DropDownButtons in WPF
/// http://andyonwpf.blogspot.com/2006/10/dropdownbuttons-in-wpf.html
/// </summary>
public class DropDownButton : ToggleButton
{
    #region Members

    public enum Placement { Bottom, Right }

    #endregion

    #region Properties

    #region DropDownPlacement

    /// <summary>
    /// DropDown placement.
    /// </summary>
    public Placement DropDownPlacement
    {
        get { return (Placement)GetValue(DropDownPlacementProperty); }
        set { SetValue(DropDownPlacementProperty, value); }
    }

    /// <summary>
    /// DropDown placement (Dependency Property).
    /// </summary>
    public static readonly DependencyProperty DropDownPlacementProperty =
        DependencyProperty.Register("DropDownPlacement", typeof(Placement),
        typeof(DropDownButton), new UIPropertyMetadata(null));

    #endregion

    #region DropDown

    /// <summary>
    /// DropDown property.
    /// </summary>
    public ContextMenu DropDown
    {
        get { return (ContextMenu)GetValue(DropDownProperty); }
        set { SetValue(DropDownProperty, value); }
    }

    /// <summary>
    /// DropDown property (Dependency property).
    /// </summary>
    public static readonly DependencyProperty DropDownProperty =
        DependencyProperty.Register("DropDown", typeof(ContextMenu),
        typeof(DropDownButton), new PropertyMetadata(null, OnDropDownChanged));

    #endregion

    #endregion

    #region Events

    private static void OnDropDownChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        ((DropDownButton)sender).OnDropDownChanged(e);
    }

    void OnDropDownChanged(DependencyPropertyChangedEventArgs e)
    {
        if (DropDown != null)
        {
            DropDown.PlacementTarget = this;

            switch (DropDownPlacement)
            {
                default:
                case Placement.Bottom:
                    DropDown.Placement = PlacementMode.Bottom;
                    break;
                case Placement.Right:
                    DropDown.Placement = PlacementMode.Right;
                    break;
            }

            this.Checked +=
                new RoutedEventHandler((a, b) => { DropDown.IsOpen = true; });
            this.Unchecked +=
                new RoutedEventHandler((a, b) => { DropDown.IsOpen = false; });
            DropDown.Closed +=
                new RoutedEventHandler((a, b) => { this.IsChecked = false; });
        }
    }

    #endregion
}

答案 1 :(得分:1)

它有一个自定义control template,其中一个看起来具有透明背景,除非鼠标悬停,当然渐变和边框也不同。

在MSDN上有一个自定义模板的an example,它会产生一个相当蓝色的按钮,基本上你可以对模板做任何事情,但它们的创建可能相当有用。 Expression Blend可以帮助控制模板。

答案 2 :(得分:1)

要获取下拉列表的菜单部分,您可以设置按钮的ContextMenu属性,然后使用ContextMenu.Placement将其正确定位在按钮下方。

您可能还需要设置ContextMenu.PlacementTarget以使其相对于Button。

答案 3 :(得分:1)

很抱歉再次添加,但我刚刚意识到此控件也存在于Codeplex上的扩展WPF工具包中:

http://wpftoolkit.codeplex.com/wikipage?title=DropDownButton

它实现如下(根据他们的网站):

<extToolkit:DropDownButton Content="Click Me" Margin="15" >
    <extToolkit:DropDownButton.DropDownContent>
        <extToolkit:ColorCanvas />
    </extToolkit:DropDownButton.DropDownContent>
</extToolkit:DropDownButton>

您可以根据需要在其中添加MenuItem。

我已将此套件用于其他功能(ChildWindow和SplitButton),我认为它做得很好。随着人们继续在WPF中请求更多Office 2007/2010功能,请继续期待CodePlex和Microsoft更多这样的事情。