WPF 分离按钮
带主题的 WPF 分离按钮

引言
由于 Windows Presentation Foundation (WPF) 没有内置拆分按钮,我决定尝试编写一个。因为我对这个框架相当陌生,我想从一些简单的东西开始,这就是我想到的。
虽然可以使用样式和控件模板来创建拆分按钮,但我希望支持 Windows 主题,因此自定义控件似乎是可行的方法。
该控件派生自 System.Windows.Controls.Button
。
Using the Code
要将拆分按钮添加到窗口,请引用程序集,然后将 XML namespace
添加到 Windows XAML 文件,如下所示
xmlns:m="clr-namespace:Wpf.Controls;assembly=Wpf.SplitButton"
下面的 XAML 将拆分按钮添加到窗口,并演示如何添加将由上下文菜单显示的 MenuItem
。
<m:SplitButton Content="Split Button" Placement="Bottom">
<MenuItem Header="MenuItem 1"/>
<MenuItem Header="MenuItem 2">
<MenuItem Header="MenuItem 1"/>
<MenuItem Header="MenuItem 2"/>
</MenuItem>
</m:SplitButton
控件程序集为每个 Windows 主题定义了一个样式。为了绘制控件,我使用了 PresentationFramework
DLL 中的 ButtonChrome
类。
演示项目在 *DemoStyles* 文件夹中包含这些样式的副本,以便我可以使用 x:Key
属性在演示窗口中显示每个主题。
我还添加了一个看起来像 Windows Vista 上运行的 Windows 资源管理器中的 Button
的 Style
。 要使用此样式,您必须使用以下语法显式设置 SplitButton
的 Style
属性
Style="{DynamicResource {x:Static m:SplitButtonResources.VistaSplitButtonStyleKey}}"
关注点
如上所示,Button
包括一个 Icon
属性。
要放置上下文菜单,请使用 Placement
、PlacementRectangle
、HorizontalOffset
和 VerticalOffset
属性。 这些是由 ContextMenuService
类定义的依赖属性,使用 AddOwner
方法。 我已将回调添加到每个属性,我可以在其中设置基本 Button
的内部上下文菜单上的等效属性。
Button
有两种模式,由 Mode
属性定义:Split
(默认)和 Dropdown
。 在 Split
模式下,控件有两个部分,Button
部分的行为就像一个普通的 button
一样,触发 Click 事件,而下拉 button
在单击时显示上下文菜单。 在 Dropdown
模式下,单击 button
上的任何位置都会显示上下文菜单。
问题
此控件是使用 Visual Studio 2008 的 Beta2 版本开发的。 遗憾的是,演示项目无法在 cider 设计器中显示(至少对我而言)。 这可能是 Visual Studio 中的一个错误,因为它在 Expression Blend 中显示正常,并且编译和运行都没有问题。
历史
2007 年 9 月 24 日:发布文章
2007 年 10 月 2 日:文章更新
- 正如在下面的评论中的
Icon
线程中讨论的那样,我已从SplitButton
中删除了Icon
属性,因为它根本不需要。 演示现在包括 Josh 描述的将图标添加到按钮的首选方法。
2007 年 10 月 9 日:文章更新
- 修复了演示中的错误
2007 年 10 月 20 日:文章更新
- Bug 修复