Dropdown-achtige knop op menutab in Windows 7

I'm just curious if anybody has an idea on how to do the dropdown like button on the windows 7 explorer tab using wpf (See Screeshot below). enter image description here

1

4 antwoord

I use this class, and it looks great: http://andyonwpf.blogspot.com/2006/10/dropdownbuttons-in-wpf.html

Ik zal hier posten zodat het schoner is om te lezen:

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

    public enum Placement { Bottom, Right }

    #endregion

    #region Properties

    #region DropDownPlacement

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

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

    #endregion

    #region DropDown

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

    /// 
    /// DropDown property (Dependency property).
    /// 
    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
}
2
toegevoegd
Ik denk dat dit de meest fatsoenlijke manier is om dit te doen. Bedankt :)
toegevoegd de auteur Allan Chua, de bron

Het heeft een aangepaste besturingssjabloon , een die een transparante achtergrond lijkt te hebben, tenzij bij een muisaanwijzer, natuurlijk zijn het verloop en de rand ook anders.

Op MSDN is er een voorbeeld voor een aangepaste sjabloon die resulteert in een eerder blauwe knop, eigenlijk kun je alles doen met de sjablonen, hun creatie kan echter behoorlijk wat werk zijn. Expression Blend kan handig zijn voor het beheren van templates.

1
toegevoegd
Het kunnen allerlei soorten besturingselementen zijn, ik denk dat de standaardsjabloon van de knop kan een goed begin zijn voor de basisweergave, maar u wilt waarschijnlijk een Menu en MenuItem gebruiken vanwege de functionaliteit. Als je een idee hebt hoe je een sjabloon moet maken met kennis van de toestanden, PART's, enz., Zou je dit opnieuw moeten kunnen maken, het is niet zo dat je trouw moet blijven aan de feitelijke internals die in Windows worden gebruikt.
toegevoegd de auteur H.B., de bron
Ja, ik weet al dat dit een besturingssjabloon is, maar heb je een idee wat de ControlElemets hier zullen zijn :)
toegevoegd de auteur Allan Chua, de bron
Je hebt daar een punt :), Het opnieuw maken van deze sjabloon op mijn eigen manier zou het probleem bevredigen. Maar ik ben nog steeds nieuwsgierig wat hier door Microsoft-jongens had kunnen worden gebruikt. Bedankt toch +1 voor jou
toegevoegd de auteur Allan Chua, de bron

Sorry voor het toevoegen van opnieuw, maar ik realiseerde me net dat dit besturingselement ook bestaat in de uitgebreide wpf Toolkit op Codeplex:

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

Het implementeert als volgt (volgens hun site):


    
        
    

Je kunt daar gewoon MenuItems in toevoegen als dat nodig is.

Ik heb deze kit gebruikt voor andere functies (ChildWindow en SplitButton) en ik denk dat het goed is gedaan. Verwacht meer van CodePlex en Microsoft, omdat mensen steeds meer Office 2007/2010-functionaliteit in wpf vragen.

1
toegevoegd

Als u het menu in de vervolgkeuzelijst wilt weergeven, kunt u de eigenschap ContextMenu van de knop instellen en vervolgens ContextMenu.Placement gebruiken om deze correct onder de knop te plaatsen.

Mogelijk moet u ook ContextMenu.PlacementTarget instellen om het relatief te houden ten opzichte van de knop.

1
toegevoegd
Ik weet hier niets van, het is conceptueel een menu en de knoppen zijn van het hoogste niveau, menuitems die er net een beetje anders uitzien, ik zou geen knop buigen om een ​​functionaliteit te bieden waarvoor het niet bedoeld was.
toegevoegd de auteur H.B., de bron
Uhmm .. dit is ook een goed idee, misschien kan een gerouteerd evenement door deze methode helpen .. bedankt +1 voor jou
toegevoegd de auteur Allan Chua, de bron
U kunt de Click-gebeurtenis van de knop implementeren om het menu te laten verschijnen door met de linkermuisknop te klikken.
toegevoegd de auteur JayP, de bron