65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 分离按钮

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (41投票s)

2007 年 9 月 24 日

CPOL

2分钟阅读

viewsIcon

319517

downloadIcon

9581

带主题的 WPF 分离按钮

Screenshot - SplitButton_a.jpg

引言

由于 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 资源管理器中的 ButtonStyle。 要使用此样式,您必须使用以下语法显式设置 SplitButtonStyle 属性

Style="{DynamicResource {x:Static m:SplitButtonResources.VistaSplitButtonStyleKey}}" 

Screenshot - SplitButton_vista.jpg

带有图标的 Vista 样式按钮

关注点

如上所示,Button 包括一个 Icon 属性。

要放置上下文菜单,请使用 PlacementPlacementRectangleHorizontalOffsetVerticalOffset 属性。 这些是由 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 修复
© . All rights reserved.