WPF SplitButton?

我刚刚度过了一个非常令人沮丧的下午搜索谷歌寻找一个商业级WPF
SplitButton
控制,将在一个
ToolBar
。 A
SplitButton
是您可以单击
Button
的主要部分进行默认操作,或单击右侧的小三角形以获取备用操作的下拉菜单的那个。 我在网上找到了几个(包括CodeProject上的一个,包括CodePlex上的两个)。它们都不能在
ToolBar
中正常工作 - 它们要么根本不显示,要么没有工具栏按钮样式。我甚至看过一些商业产品,比如ActiPro的弹出按钮(在他们的SharedLibrary DLL中)。同样的问题。 是的,我已经看到所有关于创建一个是多么容易的帖子。创建一个糟糕的版本非常容易,但创建一个看起来像Outlook或Visual Studio中的
SplitButton
s的版本并不容易,如果松开鼠标按钮,下拉菜单就不会消失。 所以,这是我的问题:是否有任何商业级的ѭ0?在工具栏中工作,无论是开源还是商业?我不是在寻找一个控制器,它是每年1,500美元订阅某人控制库的一部分,但是如果有合理价格的
SplitButton
,我肯定想找到它。     
已邀请:
我所知道的唯一真正的“商业级”分割按钮是Syncfusion,它作为功能区控件的一部分包含在内(尽管它也在功能区之外工作)。 话虽如此,我记得这个实现是相当实用和完整的,如果你正在寻找免费的东西。     
另一个好的免费实现似乎拥有它: http://huydinhpham.blogspot.com/2008/09/wpf-drop-down-and-split-button.html 拆分按钮可以在工具栏中使用,并具有适当的工具栏样式。如果你愿意,它也可以重新设计。 下拉菜单通过它自己的属性公开 - 也就是说,splitbutton可以将它自己的上下文菜单与下拉菜单分开(即使它看起来不合逻辑,它在某些情况下很有用 - 就像右键单击按钮时弹出的工具栏上下文菜单放在工具栏中)。 下拉菜单是标准的ContextMenu - 即内容可以是数据绑定,菜单项重新设置等。 拆分按钮的主要部分和下拉部分都具有与之关联的命令属性。     
在Delay的博客上有一个非常好的分裂按钮实现WPF和Silverlight: Banana SplitButton(针对SplitButton的WPF特定修复和Silverlight版本的一些代码分析改进)     
扩展的WPF工具包社区版(免费)有一个很好的
SplitButton
(它也有一个
DropDownButton
<xctk:SplitButton Content="Click Me">
    <xctk:SplitButton.DropDownContent>
        <xctk:ColorCanvas />
    </xctk:SplitButton.DropDownContent>
 </xctk:SplitButton>
    
我不知道你在分割按钮中究竟是在寻找什么,但这个关于如何创建一个视频的视频是非常完整的,并且制作了一个完美的分割按钮。 http://windowsclient.net/learn/video.aspx?v=3929 我知道你不想要一个教程,但我以前用过这个,你无法区分它和outlook中的那个。     
我认为你的意思叫做DropDownButton。 MenuItem“StaysOpenOnClick”上有一个布尔属性,可以解决您的问题。     
我一直在寻找相同的东西,只是自己动手(你需要根据自己的喜好设计样式(以匹配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>
    
使用WPF Toolkit拆分按钮显示上下文菜单是相当简单的。在窗口资源中添加上下文菜单。在窗口加载 - 将上下文菜单绑定到拆分按钮,然后像正常情况一样使用上下文菜单。 它确实需要添加到WPF工具包中,因为此按钮的大多数用例是复制旧的WinForm Splitt按钮。
<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;
        }
    }
}
    

要回复问题请先登录注册