标签:dep case cti handle lte snap mic contex this
控件cs文件
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Markup;
using System.Windows.Media;
namespace Controls
{
[TemplatePart(Name = "PART_DropDown", Type = typeof(System.Windows.Controls.Button))]
[ContentProperty("Items")]
[DefaultProperty("Items")]
public class MyButton: System.Windows.Controls.Button
{
public static readonly DependencyProperty HorizontalOffsetProperty;
public static readonly DependencyProperty IsContextMenuOpenProperty;
public static readonly DependencyProperty ModeProperty;
public static readonly DependencyProperty PlacementProperty;
public static readonly DependencyProperty PlacementRectangleProperty;
public static readonly DependencyProperty VerticalOffsetProperty;
public static readonly DependencyProperty ImageSourceProperty =
DependencyProperty.Register("ImageSource", typeof(string), typeof(MyButton), new PropertyMetadata(""));
public static readonly DependencyProperty ImageSourceChangeProperty =
DependencyProperty.Register("ImageSourceChange", typeof(string), typeof(MyButton), new PropertyMetadata(""));
///
/// Static Constructor
///
static MyButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyButton), new FrameworkPropertyMetadata(typeof(MyButton)));
IsContextMenuOpenProperty = DependencyProperty.Register("IsContextMenuOpen", typeof(bool), typeof(MyButton), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsContextMenuOpenChanged)));
ModeProperty = DependencyProperty.Register("Mode", typeof(MyButtonMode), typeof(MyButton), new FrameworkPropertyMetadata(MyButtonMode.Split));
PlacementProperty = ContextMenuService.PlacementProperty.AddOwner(typeof(MyButton), new FrameworkPropertyMetadata(PlacementMode.Bottom, new PropertyChangedCallback(OnPlacementChanged)));
PlacementRectangleProperty = ContextMenuService.PlacementRectangleProperty.AddOwner(typeof(MyButton), new FrameworkPropertyMetadata(Rect.Empty, new PropertyChangedCallback(OnPlacementRectangleChanged)));
HorizontalOffsetProperty = ContextMenuService.HorizontalOffsetProperty.AddOwner(typeof(MyButton), new FrameworkPropertyMetadata(0.0, new PropertyChangedCallback(OnHorizontalOffsetChanged)));
VerticalOffsetProperty = ContextMenuService.VerticalOffsetProperty.AddOwner(typeof(MyButton), new FrameworkPropertyMetadata(0.0, new PropertyChangedCallback(OnVerticalOffsetChanged)));
}
/*
* Overrides
*
*/
///
/// OnApplyTemplate override, set up the click event for the dropdown if present in the template
///
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// set up the click event handler for the dropdown button
System.Windows.Controls.Primitives.ButtonBase dropDown = this.Template.FindName("PART_DropDown", this) as System.Windows.Controls.Primitives.ButtonBase;
if (dropDown != null)
dropDown.Click += Dropdown_Click;
}
///
/// Handles the Base Buttons OnClick event
///
protected override void OnClick()
{
switch (Mode)
{
case MyButtonMode.Dropdown:
OnDropdown();
break;
default:
base.OnClick(); // forward on the Click event to the user
break;
}
}
/*
* Properties
*
*/
///
/// The Split Button‘s Items property maps to the base classes ContextMenu.Items property
///
public ItemCollection Items
{
get
{
EnsureContextMenuIsValid();
return this.ContextMenu.Items;
}
}
/*
* DependencyProperty CLR wrappers
*
*/
public string ImageSource
{
get { return (string)GetValue(ImageSourceProperty); }
set { SetValue(ImageSourceProperty, value); }
}
public string ImageSourceChange
{
get { return (string)GetValue(ImageSourceChangeProperty); }
set { SetValue(ImageSourceChangeProperty, value); }
}
///
/// Gets or sets the IsContextMenuOpen property.
///
public bool IsContextMenuOpen
{
get { return (bool)GetValue(IsContextMenuOpenProperty); }
set { SetValue(IsContextMenuOpenProperty, value); }
}
///
/// Placement of the Context menu
///
public PlacementMode Placement
{
get { return (PlacementMode)GetValue(PlacementProperty); }
set { SetValue(PlacementProperty, value); }
}
///
/// PlacementRectangle of the Context menu
///
public Rect PlacementRectangle
{
get { return (Rect)GetValue(PlacementRectangleProperty); }
set { SetValue(PlacementRectangleProperty, value); }
}
///
/// HorizontalOffset of the Context menu
///
public double HorizontalOffset
{
get { return (double)GetValue(HorizontalOffsetProperty); }
set { SetValue(HorizontalOffsetProperty, value); }
}
///
/// VerticalOffset of the Context menu
///
public double VerticalOffset
{
get { return (double)GetValue(VerticalOffsetProperty); }
set { SetValue(VerticalOffsetProperty, value); }
}
///
/// Defines the Mode of operation of the Button
///
///
/// The MyButton two Modes are
/// Split (default), - the button has two parts, a normal button and a dropdown which exposes the ContextMenu
/// Dropdown - the button acts like a combobox, clicking anywhere on the button opens the Context Menu
///
public MyButtonMode Mode
{
get { return (MyButtonMode)GetValue(ModeProperty); }
set { SetValue(ModeProperty, value); }
}
/*
* DependencyPropertyChanged callbacks
*
*/
private static void OnIsContextMenuOpenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyButton s = (MyButton)d;
s.EnsureContextMenuIsValid();
if (!s.ContextMenu.HasItems)
return;
bool value = (bool)e.NewValue;
if (value && !s.ContextMenu.IsOpen)
s.ContextMenu.IsOpen = true;
else if (!value && s.ContextMenu.IsOpen)
s.ContextMenu.IsOpen = false;
}
///
/// Placement Property changed callback, pass the value through to the buttons context menu
///
private static void OnPlacementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyButton s = d as MyButton;
if (s == null) return;
s.EnsureContextMenuIsValid();
s.ContextMenu.Placement = (PlacementMode)e.NewValue;
}
///
/// PlacementRectangle Property changed callback, pass the value through to the buttons context menu
///
private static void OnPlacementRectangleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyButton s = d as MyButton;
if (s == null) return;
s.EnsureContextMenuIsValid();
s.ContextMenu.PlacementRectangle = (Rect)e.NewValue;
}
///
/// HorizontalOffset Property changed callback, pass the value through to the buttons context menu
///
private static void OnHorizontalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyButton s = d as MyButton;
if (s == null) return;
s.EnsureContextMenuIsValid();
s.ContextMenu.HorizontalOffset = (double)e.NewValue;
}
///
/// VerticalOffset Property changed callback, pass the value through to the buttons context menu
///
private static void OnVerticalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyButton s = d as MyButton;
if (s == null) return;
s.EnsureContextMenuIsValid();
s.ContextMenu.VerticalOffset = (double)e.NewValue;
}
/*
* Helper Methods
*
*/
///
/// Make sure the Context menu is not null
///
private void EnsureContextMenuIsValid()
{
if (this.ContextMenu == null)
{
this.ContextMenu = new System.Windows.Controls.ContextMenu();
this.ContextMenu.PlacementTarget = this;
this.ContextMenu.Placement = Placement;
this.ContextMenu.Opened += ((sender, routedEventArgs) => IsContextMenuOpen = true);
this.ContextMenu.Closed += ((sender, routedEventArgs) => IsContextMenuOpen = false);
}
}
private void OnDropdown()
{
EnsureContextMenuIsValid();
if (!this.ContextMenu.HasItems)
return;
this.ContextMenu.IsOpen = !IsContextMenuOpen; // open it if closed, close it if open
}
/*
* Events
*
*/
///
/// Event Handler for the Drop Down Button‘s Click event
///
///
///
private void Dropdown_Click(object sender, RoutedEventArgs e)
{
OnDropdown();
e.Handled = true;
}
}
}
控件xaml
ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:comm="clr-namespace:Controls">
页面使用:
comm:MyButton
Width="38"
Height="40"
ImageSource="/control;component/Icons/picture2.png"
ImageSourceChange="/control;component/Icons/picture1.png">
WPF自定义控件 依赖属性绑定
标签:dep case cti handle lte snap mic contex this
原文地址:http://www.cnblogs.com/amwuau/p/7561570.html