2009-09-11 39 views
20

我刚刚度过了一个非常令人沮丧的下午,搜索Google寻找商业级WPF SplitButton控件,该控件将在ToolBar中工作。 A SplitButton是您可以点击Button的主要部分采取默认操作,或点击右侧的一个小三角形以获得备用操作的下拉菜单的地方。WPF SplitButton?

我在网上找到了几个(包括CodeProject上的一个,包括CodePlex上的两个)。他们没有一个在ToolBar中正常工作 - 他们要么完全不出现,要么没有工具栏按钮样式。我甚至看了一些商业产品,比如ActiPro的弹出式按钮(在他们的SharedLibrary DLL中)。同样的问题。

是的,我已经看到所有关于如何轻松创建一个的帖子。创建一个坏的很容易,但不容易创建一个外观和工作方式类似于Outlook或Visual Studio中的SplitButton,如果释放鼠标按钮,下拉菜单不会消失。

所以,这里是我的问题:是否有任何商业级SplitButton,无论是开源或商业,工作在工具栏?我并不是在寻找一个控制权,这个控制权是某人控制图书馆每年1,500美元的订阅费用的一部分,但如果价格合理的SplitButton,我一定会找到它的。

回答

7

我知道的唯一真正的“商业级”拆分按钮是Syncfusion,它作为其功能区控件的一部分包含在其中(尽管它也可以在功能区外工作)。

这就是说,我记得this implementation是相当有用和完整的,如果你正在寻找一些免费的东西。

+0

是啊,我遇到周勇的实现我最初的搜索来了。不幸的是,源代码链接被破坏。 –

+4

更新:我再次看了周永的博客,并发表评论,有人说他们在Channel9上找到了源代码。在这里找到它:http://channel9.msdn.com/playground/Sandbox/244830-SplitButton/ –

+0

请注意,Syncfusion现在有两个SplitButtons:* SplitButton *是它们的Ribbon控件的一部分,在ToolBars中也能很好地工作。相比之下,* SplitButtonAdv *在其自身周围绘制了一个“按钮边框”,这意味着它不适合在ToolBar中进行可视化。 –

2

我不知道你在分割按钮中究竟在寻找什么,但是这个关于如何创建一个的视频非常完整,并且使得splitbutton几乎完美。

http://windowsclient.net/learn/video.aspx?v=3929

我知道你不想一个教程,但我以前用过这个,你不能告诉它和前景的人之间的差异。

+0

该链接不再适用。李Brimelow似乎已经消失,这是一个耻辱。当我搜索按钮时,我看到了多次引用的视频,显然这个教程非常好。如果您遇到工作链接,请告诉我。谢谢。 –

+0

啊,无赖你是对的。真是太遗憾了 - 这是一个很好的演示。 –

+0

我已经与他联系了关于视频。他现在似乎在为Adobe工作......希望他会愿意再次分享这些视频。 –

1

我想你的意思叫做DropDownButton。 MenuItem“StaysOpenOnClick”上有一个布尔属性,可以解决您的问题。

+0

为什么是-1?我说的是错的吗? – codymanix

+5

我并没有付诸表决,但我认为你可能误解了这个问题。 DropDown按钮会丢弃它的菜单,而不管它在哪里被点击。 SplitButton有两个区域;一个主要区域和一个下拉区域。如果您单击主区域,该按钮将采用默认操作。如果你点击下拉区域,它将删除它的菜单。如果您查看VS 2008主工具栏上的“新建项目”按钮,您将看到SplitButton的示例。 –

+0

大卫,是的,但你可以把正常的按钮旁边的另一个下拉按钮,只有一个向下的箭头图标,以达到相同的效果 – Epirocks

6

另一个很好的免费实现,似乎拥有了一切:

http://huydinhpham.blogspot.com/2008/09/wpf-drop-down-and-split-button.html

  • 拆分按钮可以在工具栏中使用,并有适当的工具栏风格。如果你愿意,它也可以重新调整。
  • 下拉菜单是通过它自己的属性暴露 - 即splitbutton可以有它自己的上下文菜单与下拉菜单分开(即使它看起来不合逻辑,但在某些情况下可能有用 - 例如右击时弹出的工具栏上下文菜单放置在工具栏上的按钮上)。
  • 下拉菜单是标准的上下文菜单 - 即内容可以是数据绑定,菜单项重新调整等。
  • 分离按钮的主要部分和下拉部分都具有与它们相关联的命令属性。
+0

感谢您的链接 - 我upvoted你的回应 –

+0

似乎是专为XP风格卢娜)只有,不适应航空主题。 – floele

3

没有为WPF和Silverlight的一个很好的拆分按钮实现了延迟的博客:

Banana SplitButton (A WPF-specific fix for SplitButton and some code analysis improvements for the Silverlight version, too)

+0

这是我目前使用的那个。虽然这个实现有一些问题,但是与其他人相比,我认为这是最好看,最简单。 – jpierson

+0

是的,我目前看到的一个问题是它直接引用了Aero主题组件,这使得它在经典/非Aero主题上看起来不一致。 – huseyint

3

Extended WPF Toolkit Community Edition(这是免费的),有一个很好的SplitButton(它有一个DropDownButton以及)

SplitButton screen capture

<xctk:SplitButton Content="Click Me"> 
    <xctk:SplitButton.DropDownContent> 
     <xctk:ColorCanvas /> 
    </xctk:SplitButton.DropDownContent> 
</xctk:SplitButton> 
+2

在任何人试图尝试之前:这个实现并不是非常有用,因为它只支持在下拉区域添加“任何”内容。一个实际的菜单(如99%的所有拆分按钮将如何)看起来像一个是不可能的:( – floele

0

我正在寻找相同的东西,只是推出了我自己的(你需要根据自己的喜好设计风格(与ToolBar匹配),并且可以重构它/将其转换为自定义控件等等)

<StackPanel x:Name="Split" Orientation="Horizontal"> 
    <Button Command="{Binding MainCommand}"> 
     <StackPanel> 
      <Image Source="{StaticResource MainCommandImage}"/> 
      <TextBlock>MainCommand</TextBlock> 
     </StackPanel> 
    </Button> 
    <Separator HorizontalAlignment="Left" Width="1" VerticalAlignment="Stretch" Margin="0,5"/> 
    <CheckBox Width="16" IsThreeState="False"> 
     <Grid> 
      <Path Fill="Black" Data="{StaticResource DownArrowGeometry}" 
        Stretch="Uniform" Height="6" Width="6" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      <Popup x:Name="popupOptions" AllowsTransparency="True" PopupAnimation="Fade" StaysOpen="False" 
        Placement="Bottom" PlacementTarget="{Binding ElementName=Split}" HorizontalOffset="-3" 
        IsOpen="{Binding RelativeSource={RelativeSource AncestorType={x:Type CheckBox}, AncestorLevel=1}, Path=IsChecked}"> 
       <StackPanel> 
        <StackPanel> 
         <Image Source="{StaticResource SubCommandImage1}"/> 
         <TextBlock>SubCommand1</TextBlock> 
        </StackPanel> 
        <StackPanel> 
         <Image Source="{StaticResource SubCommandImage2}"/> 
         <TextBlock>SubCommand2</TextBlock> 
        </StackPanel> 
       </StackPanel> 
      </Popup> 
     </Grid> 
    </CheckBox> 
</StackPanel> 
0

使用WPF工具包拆分按钮来显示上下文菜单非常简单。在窗口资源中添加一个上下文菜单。在窗口加载时 - 将上下文菜单绑定到拆分按钮,然后像通常那样使用上下文菜单。

它确实需要添加到WPF工具包中,因为此按钮的大多数用例是复制旧的WinForm Splitt按钮。

enter image description here

<Window x:Class="SplitButtonTesting.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ContextMenu x:Key="contextMenu" IsOpen="{Binding IsOpen}"> 
     <MenuItem Header="One" /> 
     <MenuItem Header="Two" /> 
     <MenuItem Header="More..."> 
      <MenuItem Header="One" /> 
      <MenuItem Header="Two" /> 
     </MenuItem> 
    </ContextMenu> 
</Window.Resources> 
<DockPanel> 

    <Menu DockPanel.Dock="Top" x:Name="ApplicationMenu"> 

     <xctk:SplitButton x:Name="SplitButton" Content="Main Button" DropDownContent="{x:Null}" /> 

    </Menu> 
    <Border /> 

</DockPanel> 

后面的代码:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Controls.Primitives; 

namespace SplitButtonTesting 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      SetupSplitButton(); 
     } 

     public void SetupSplitButton() 
     { 
      var menu = this.Resources["contextMenu"] as ContextMenu; 

      menu.PlacementTarget = SplitButton; 

      menu.Placement = PlacementMode.Bottom; 
      menu.DataContext = SplitButton; 
     } 
    } 
}