WPF SplitButton?

时间:2009-09-11 22:17:56

标签: wpf button split-button

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

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

是的,我已经看过所有帖子,关于创建一个是多么容易。创建一个糟糕的内容非常容易,但创建一个看起来像Outlook或Visual Studio中的SplitButton的内容并不容易,如果释放鼠标按钮,下拉菜单不会消失

所以,这是我的问题:在工具栏中是否存在任何商业级SplitButton,无论是开源还是商业?我不是在寻找一个控件,它是每年1,500美元订阅某人控件库的一部分,但是如果价格合理{{1}},我肯定想找到它。

8 个答案:

答案 0 :(得分:7)

我所知道的唯一真正的“商业级”分割按钮是Syncfusion的按钮,它作为功能区控件的一部分包含在内(虽然它也可以在功能区外工作)。

话虽如此,我记得this implementation如果你正在寻找免费的东西,那么它是相当实用和完整的。

答案 1 :(得分:6)

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

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

  • 拆分按钮可以在工具栏中使用,并具有适当的工具栏样式。如果你愿意,它也可以重新设计。
  • 下拉菜单通过它自己的属性公开 - 也就是说,splitbutton可以将它自己的上下文菜单与下拉菜单分开(即使它看起来不合逻辑,它在某些情况下很有用 - 比如右键单击时弹出的工具栏上下文菜单放在工具栏中的按钮上。)
  • 下拉菜单是标准的ContextMenu - 即内容可以是数据绑定,菜单项重新设置等。
  • 拆分按钮的主要部分和下拉部分都具有与之关联的命令属性。

答案 2 :(得分:3)

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

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

我知道你不想要一个教程,但我以前用过这个,你无法区分它和outlook中的那些。

答案 3 :(得分:3)

答案 4 :(得分: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>

答案 5 :(得分:1)

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

答案 6 :(得分: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>

答案 7 :(得分:0)

使用WPF Toolkit拆分按钮显示上下文菜单相当简单。在窗口资源中添加上下文菜单。在窗口加载 - 将上下文菜单绑定到拆分按钮,然后像正常情况一样使用上下文菜单。

它确实需要添加到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;
        }
    }
}