【问题标题】:WPF SplitButton? [closed]WPF拆分按钮? [关闭]
【发布时间】:2010-11-27 15:57:21
【问题描述】:

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

我在网上找到了几个(包括 CodeProject 上的一个,以及 CodePlex 上的两个)。它们都不能在ToolBar 中正常工作——它们要么根本不出现,要么没有工具栏按钮样式。我什至查看了一些商业产品,例如 ActiPro 的弹出按钮(在他们的 SharedLibrary DLL 中)。同样的问题。

是的,我看过所有关于创建一个多么容易的帖子。创建一个坏的很容易,但要创建一个看起来和工作起来像 Outlook 或 Visual Studio 中的 SplitButtons 的文件并不容易,如果您释放鼠标按钮,下拉菜单不会消失。

所以,我的问题是:是否有任何商业级的SplitButtons,无论是开源的还是商业的,都可以在工具栏中使用?我不是在寻找一个属于每年 1,500 美元订阅某人控件库的一部分的控件,但如果有一个价格合理的 SplitButton,我一定会找到它。

【问题讨论】:

    标签: wpf button split-button


    【解决方案1】:

    据我所知,唯一真正的“商业级”拆分按钮是 Syncfusion 的那个,它包含在他们的功能区控件中(尽管它也可以在功能区之外使用)。

    话虽如此,我记得this implementation 相当实用且完整,如果您正在寻找免费的东西。

    【讨论】:

    • 是的,我在最初的搜索中遇到了周勇的实现。不幸的是,源代码链接已损坏。
    • 更新:我又看了周勇的博客,看到有人说他们在Channel9找到了源代码。在这里找到它:channel9.msdn.com/playground/Sandbox/244830-SplitButton
    • 请注意,Syncfusion 现在有两个拆分按钮:作为其功能区控件的一部分的 SplitButton 在工具栏中也能正常工作。相比之下,SplitButtonAdv 在其自身周围绘制了一个“按钮边框”,这意味着它在视觉上不适合工具栏。
    • @Daniel:这是(许多事情之一)我不太喜欢 Syncfusion 的 WPF 产品 - 再说一次,它们可能是我最喜欢的 WPF 供应商……最后两年来,大多数 WPF 工具包供应商现在都将此功能包含在一个更简洁的包中。
    • Syncfusion 现在是免费的......有点,他们有一个“社区”许可证,所以如果你是一个人或一个小商店,那就去看看吧。
    【解决方案2】:

    我不知道您到底在寻找什么拆分按钮,但是这个关于如何创建拆分按钮的视频非常完整,并且制作了一个几乎完美的拆分按钮。

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

    我知道你不想要教程,但我以前用过这个,你无法分辨它和 Outlook 中的区别。

    【讨论】:

    • 那个链接已经失效了。 Lee Brimelow 似乎消失了,这是一种耻辱。我在搜索按钮时多次看到引用的视频,显然该教程非常好。如果您遇到工作链接,请告诉我。谢谢。
    • 哎呀,你是对的。真可惜 - 这是一个很好的演示。
    • 我已就视频与他联系。他现在似乎在为 Adob​​e 工作……希望他愿意再次分享这些视频。
    • 感谢 Anderson 的跟进——非常感谢。我赞成你的回应。
    【解决方案3】:

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

    【讨论】:

    • 为什么是-1?我说错了吗?
    • 我没有投反对票,但我认为您可能误解了这个问题。 DropDown Button 无论在何处单击都会删除其菜单。 SplitButton 有两个区域;一个主区域和一个下拉区域。如果单击主区域,则该按钮将执行默认操作。如果单击下拉区域,它会删除其菜单。如果您查看 VS 2008 主工具栏上的“新建项目”按钮,您将看到一个拆分按钮的示例。
    • 大卫,是的,但是您可以在另一个下拉按钮旁边放置一个普通按钮,该按钮只有一个向下箭头图标以达到相同的效果
    【解决方案4】:

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

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

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

    【讨论】:

    • 感谢您的链接——我赞成您的回复
    • 似乎只为 XP 风格(Luna)设计,不适应 Aero 主题。
    【解决方案5】:

    Delay 的博客中有一个相当不错的 WPF 和 Silverlight 拆分按钮实现:

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

    【讨论】:

    • 这是我目前正在使用的。虽然这个实现存在一些问题,但与其他实现相比,我认为它是最好看和最简单的。
    • 是的,我目前看到的一个问题是它直接引用 Aero 主题程序集,这使得它在经典/非 Aero 主题上的外观不一致。
    【解决方案6】:

    Extended WPF Toolkit Community Edition(免费)有一个不错的SplitButton(它也有一个DropDownButton

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

    【讨论】:

    • 在任何人尝试之前:这个实现不是很有用,因为它只支持在下拉区域中添加“任何”内容。一个看起来像一个的实际菜单(就像所有拆分按钮的 99% 一样)是不可能的:(
    【解决方案7】:

    我一直在寻找相同的,只是推出了自己的(您需要根据自己的喜好设置样式(以匹配工具栏),您可以对其进行重构/将其转换为自定义控件......等等)

    <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>
    

    【讨论】:

      【解决方案8】:

      使用 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;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2015-01-31
        • 2013-06-27
        • 2012-01-08
        • 2011-03-01
        • 1970-01-01
        相关资源
        最近更新 更多