/************************************************************************************* Extended WPF Toolkit Copyright (C) 2007-2013 Xceed Software Inc. This program is provided to you under the terms of the Microsoft Public License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license For more features, controls, and fast professional support, pick up the Plus Edition at http://xceed.com/wpf_toolkit Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids ***********************************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Controls.Primitives; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Diagnostics; namespace Xceed.Wpf.AvalonDock.Controls { public class DropDownButton : ToggleButton { public DropDownButton() { this.Unloaded += new RoutedEventHandler(DropDownButton_Unloaded); } #region DropDownContextMenu /// /// DropDownContextMenu Dependency Property /// public static readonly DependencyProperty DropDownContextMenuProperty = DependencyProperty.Register("DropDownContextMenu", typeof(ContextMenu), typeof(DropDownButton), new FrameworkPropertyMetadata((ContextMenu)null, new PropertyChangedCallback(OnDropDownContextMenuChanged))); /// /// Gets or sets the DropDownContextMenu property. This dependency property /// indicates drop down menu to show up when user click on an anchorable menu pin. /// public ContextMenu DropDownContextMenu { get { return (ContextMenu)GetValue(DropDownContextMenuProperty); } set { SetValue(DropDownContextMenuProperty, value); } } /// /// Handles changes to the DropDownContextMenu property. /// private static void OnDropDownContextMenuChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((DropDownButton)d).OnDropDownContextMenuChanged(e); } /// /// Provides derived classes an opportunity to handle changes to the DropDownContextMenu property. /// protected virtual void OnDropDownContextMenuChanged(DependencyPropertyChangedEventArgs e) { var oldContextMenu = e.OldValue as ContextMenu; if (oldContextMenu != null && IsChecked.GetValueOrDefault()) oldContextMenu.Closed -= new RoutedEventHandler(OnContextMenuClosed); } #endregion #region DropDownContextMenuDataContext /// /// DropDownContextMenuDataContext Dependency Property /// public static readonly DependencyProperty DropDownContextMenuDataContextProperty = DependencyProperty.Register("DropDownContextMenuDataContext", typeof(object), typeof(DropDownButton), new FrameworkPropertyMetadata((object)null)); /// /// Gets or sets the DropDownContextMenuDataContext property. This dependency property /// indicates data context to set for drop down context menu. /// public object DropDownContextMenuDataContext { get { return (object)GetValue(DropDownContextMenuDataContextProperty); } set { SetValue(DropDownContextMenuDataContextProperty, value); } } #endregion protected override void OnClick() { if (DropDownContextMenu != null) { //IsChecked = true; DropDownContextMenu.PlacementTarget = this; DropDownContextMenu.Placement = PlacementMode.Bottom; DropDownContextMenu.DataContext = DropDownContextMenuDataContext; DropDownContextMenu.Closed += new RoutedEventHandler(OnContextMenuClosed); DropDownContextMenu.IsOpen = true; } base.OnClick(); } void OnContextMenuClosed(object sender, RoutedEventArgs e) { //Debug.Assert(IsChecked.GetValueOrDefault()); var ctxMenu = sender as ContextMenu; ctxMenu.Closed -= new RoutedEventHandler(OnContextMenuClosed); IsChecked = false; } void DropDownButton_Unloaded(object sender, RoutedEventArgs e) { // When changing theme, Unloaded event is called, erasing the DropDownContextMenu. // Prevent this on theme changes. if( this.IsLoaded ) { DropDownContextMenu = null; } } } }