Выпадающая кнопка на вкладке меню в Windows 7 - PullRequest
1 голос
/ 07 декабря 2011

Мне просто любопытно, если у кого-нибудь есть идея, как сделать выпадающую кнопку «Нравится» на вкладке проводника Windows 7 с помощью WPF (см. «Скриншот» ниже).enter image description here

Ответы [ 4 ]

2 голосов
/ 10 декабря 2011

Я использую этот класс, и он выглядит великолепно: 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 голос
/ 10 декабря 2011

Извините за добавление еще раз, но я только что понял, что этот элемент управления также существует в Extended WPF Toolkit на Codeplex:

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

Он реализуется так (согласно их сайту)

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

Вы можете просто добавить туда MenuItems по мере необходимости.

Я использовал этот комплект для других функций (ChildWindow и SplitButton), и я думаю, что он сделан хорошо.Продолжайте ожидать большего от CodePlex и Microsoft, так как люди продолжают запрашивать дополнительные функции Office 2007/2010 в WPF.

1 голос
/ 07 декабря 2011

Чтобы получить часть раскрывающегося меню, вы можете установить свойство ContextMenu кнопки, а затем использовать ContextMenu.Placement, чтобы правильно расположить ее под кнопкой.

Возможно, вам также потребуется установить ContextMenu.PlacementTarget, чтобы сохранитьэто относительно кнопки.

1 голос
/ 07 декабря 2011

У него есть пользовательский шаблон элемента управления , который имеет прозрачный фон, если только при наведении курсора мыши, конечно, градиент и граница тоже разные.

В MSDN есть пример для пользовательского шаблона, который приводит к довольно синей кнопке, в основном вы можете делать с шаблонами все что угодно, хотя их создание может быть довольно трудоемким. Выражение Blend может быть полезным для шаблонов управления.

...