答案 0 :(得分:2)
我使用这个类,它看起来很棒: 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 :(得分:1)
它有一个自定义control template,其中一个看起来具有透明背景,除非鼠标悬停,当然渐变和边框也不同。
在MSDN上有一个自定义模板的an example,它会产生一个相当蓝色的按钮,基本上你可以对模板做任何事情,但它们的创建可能相当有用。 Expression Blend可以帮助控制模板。
答案 2 :(得分:1)
要获取下拉列表的菜单部分,您可以设置按钮的ContextMenu属性,然后使用ContextMenu.Placement将其正确定位在按钮下方。
您可能还需要设置ContextMenu.PlacementTarget以使其相对于Button。
答案 3 :(得分:1)
很抱歉再次添加,但我刚刚意识到此控件也存在于Codeplex上的扩展WPF工具包中:
http://wpftoolkit.codeplex.com/wikipage?title=DropDownButton
它实现如下(根据他们的网站):
<extToolkit:DropDownButton Content="Click Me" Margin="15" >
<extToolkit:DropDownButton.DropDownContent>
<extToolkit:ColorCanvas />
</extToolkit:DropDownButton.DropDownContent>
</extToolkit:DropDownButton>
您可以根据需要在其中添加MenuItem。
我已将此套件用于其他功能(ChildWindow和SplitButton),我认为它做得很好。随着人们继续在WPF中请求更多Office 2007/2010功能,请继续期待CodePlex和Microsoft更多这样的事情。