C# Windows 7中菜单选项卡上的下拉式按钮

C# Windows 7中菜单选项卡上的下拉式按钮,c#,.net,wpf,xaml,wpf-controls,C#,.net,Wpf,Xaml,Wpf Controls,我只是好奇,是否有人知道如何使用WPF在Windows7浏览器选项卡上使用下拉式按钮,请参见下面的Screeshot。 它有一个自定义,除非鼠标悬停,否则它的背景看起来是透明的,当然渐变和边框也不同 在MSDN上有一个定制的模板,它会产生一个蓝色的按钮,基本上你可以用这些模板做任何事情,但是它们的创建可能需要相当多的工作。Expression Blend有助于控件模板制作。它有一个自定义,除非鼠标悬停,否则它的背景看起来是透明的,当然渐变和边框也不同 在MSDN上有一个定制的模板,它会产生一个蓝

我只是好奇,是否有人知道如何使用WPF在Windows7浏览器选项卡上使用下拉式按钮,请参见下面的Screeshot。

它有一个自定义,除非鼠标悬停,否则它的背景看起来是透明的,当然渐变和边框也不同

在MSDN上有一个定制的模板,它会产生一个蓝色的按钮,基本上你可以用这些模板做任何事情,但是它们的创建可能需要相当多的工作。Expression Blend有助于控件模板制作。

它有一个自定义,除非鼠标悬停,否则它的背景看起来是透明的,当然渐变和边框也不同


在MSDN上有一个定制的模板,它会产生一个蓝色的按钮,基本上你可以用这些模板做任何事情,但是它们的创建可能需要相当多的工作。Expression Blend有助于控件模板化。

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


您可能还必须设置ContextMenu.PlacementTarget以使其相对于按钮。

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


您可能还需要设置ContextMenu.PlacementTarget以使其与按钮保持相对位置。

我使用这个类,它看起来很棒:

我将在此处发布,以便更清晰地阅读:

/// <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
}

我使用这个类,它看起来很棒:

我将在此处发布,以便更清晰地阅读:

/// <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
}

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

它根据他们的站点执行如下操作:

<extToolkit:DropDownButton Content="Click Me" Margin="15" >
    <extToolkit:DropDownButton.DropDownContent>
        <extToolkit:ColorCanvas />
    </extToolkit:DropDownButton.DropDownContent>
</extToolkit:DropDownButton>
您可以根据需要在其中添加菜单项


我已经将这个工具包用于ChildWindow和SplitButton的其他功能,我认为它做得很好。随着人们不断要求WPF提供更多Office 2007/2010功能,继续期待CodePlex和Microsoft提供更多类似的功能。

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

它根据他们的站点执行如下操作:

<extToolkit:DropDownButton Content="Click Me" Margin="15" >
    <extToolkit:DropDownButton.DropDownContent>
        <extToolkit:ColorCanvas />
    </extToolkit:DropDownButton.DropDownContent>
</extToolkit:DropDownButton>
您可以根据需要在其中添加菜单项


我已经将这个工具包用于ChildWindow和SplitButton的其他功能,我认为它做得很好。随着人们不断要求WPF提供更多的Office 2007/2010功能,继续期待CodePlex和Microsoft提供更多类似的功能。

是的,我知道这是一个控件模板,但您知道这里将使用哪些控件吗:它可以是各种控件,我认为按钮的使用可能是基本外观的一个良好开端,但由于功能性的原因,您可能希望模板化菜单和菜单项。如果您知道如何创建一个模板,其中包括状态、部件等方面的知识。您应该能够重新创建该模板,但您并不需要忠实于Windows中使用的实际内部结构。您有一个观点:,以我自己的方式重新创建此模板可以解决此问题。但我仍然很好奇微软的人在这里用了什么。无论如何,谢谢你+1是的,我知道这是一个控件模板,但是你知道这里将使用什么样的控件吗:它可以是各种各样的控件,我认为按钮的使用可能是基本外观的一个很好的开始,但你可能想模板菜单和菜单项,因为功能。如果您知道如何创建一个模板,其中包括状态、部件等方面的知识。您应该能够重新创建该模板,但您并不需要忠实于Windows中使用的实际内部结构。您有一个观点:,以我自己的方式重新创建此模板可以解决此问题。但我仍然很好奇微软的人在这里用了什么。无论如何,谢谢你。。这也是一个好主意,也许路由事件可以通过此方法提供帮助。。感谢+1您您可以实现按钮的单击事件,让菜单在鼠标左键单击时下拉。我不知道这是一个概念上的菜单,按钮是顶级菜单,只是看起来有点不同,我不会弯曲按钮来提供它不适用的功能。嗯。。这也是一个好主意,也许路由事件可以通过此方法提供帮助。。感谢+1您您可以实现按钮的单击事件,让菜单在鼠标左键单击时下拉。我不知道这是什么,它在概念上是一个菜单,按钮是顶级菜单,只是看起来有点不同,我不会弯曲一个按钮来提供一个不适合它的功能。我认为这是最体面的方式来做到这一点。谢谢:我认为这是最体面的方式。谢谢: