2009-09-11 5 views
20

Я только что потратил очень неудачный послеобеденный трал Google, ища коммерческий WPF SplitButton, который будет работать в ToolBar. A SplitButton - это тот, где вы можете щелкнуть основную часть Button, чтобы выполнить действие по умолчанию, или щелкнуть по маленькому треугольнику справа, чтобы получить раскрывающееся меню альтернативных действий).WPF SplitButton?

Я нашел несколько в Интернете (в том числе и на CodeProject, и в том числе на CodePlex). Ни один из них не работает должным образом в ToolBar - они либо вообще не появляются, либо у них нет стиля кнопок на панели инструментов. Я даже посмотрел на некоторые коммерческие предложения, такие как всплывающая кнопка ActiPro (в их SharedLibrary DLL). Те же проблемы.

И да, я видел все сообщения о том, как легко создать его. Очень просто создать плохой, но не так просто создать тот, который выглядит и работает как SplitButton s в Outlook или Visual Studio, где раскрывающееся меню не исчезает, если вы отпустите кнопку мыши.

Итак, вот мой вопрос: есть ли коммерческий класс SplitButton с открытым исходным кодом или коммерческий, который работает в панелях инструментов? Я не ищу элемент управления, который является частью ежегодной подписки на 1500 долларов на чью-либо контрольную библиотеку, но если есть разумная цена SplitButton, я бы точно ее нашел.

ответ

7

Единственная настоящая «коммерческая ракета», которую я знаю, является одной из Syncfusion, которая входит в состав элементов управления лентой (хотя она работает и за пределами ленты).

Это, как говорится, я помню, как this implementation был достаточно полезным и полным, если вы ищете что-то бесплатно.

+0

Да, я наткнулся на осуществление Чжоу Юн в своем первоначальном поиске. К сожалению, ссылка на исходный код нарушена. –

+4

Обновление: я снова посмотрел на блог Чжоу Юна и полюбил комментарий, где кто-то сказал, что нашел исходный код на Channel9. Находите его здесь: http://channel9.msdn.com/playground/Sandbox/244830-SplitButton/ –

+0

Обратите внимание, что Syncfusion теперь имеет два SplitButtons: * SplitButton *, который является частью их элементов управления лентой, также хорошо работает в ToolBars. * SplitButtonAdv *, напротив, рисует «рамку кнопки» вокруг себя, что означает, что он не вписывается визуально в ToolBar. –

2

Я не знаю, что именно вы ищете в сплите-кнопке, но это видео о том, как его создать, довольно полно и делает кнопку разделения, которая почти идеальна.

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

Я знаю, что вы не хотите, учебник, но я использовал это раньше, и вы не могли бы сказать, разница между ним и теми, в мировоззрении.

+0

Эта ссылка больше не работает. Ли Бримлоу, похоже, исчез, что позор. Я видел видео, на которое ссылались несколько раз, когда я искал кнопку, и, видимо, учебник неплох. Если вы встретите рабочую ссылку, пожалуйста, дайте мне знать. Благодарю. –

+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 может иметь собственное контекстное меню отдельно от раскрывающегося списка (хотя в некоторых случаях это кажется нелогичным, что может быть полезно в некоторых случаях - например, контекстное меню панели инструментов, которое появляется при щелчке правой кнопкой мыши на кнопке, расположенной на панели инструментов).
  • Выпадающее меню является стандартным ContextMenu - то есть содержимое может быть привязано к базе данных, элементы меню рестайлинговые и т. Д.
  • Как основная, так и выпадающая части кнопки разделения имеют связанные с ними свойства команд.
+0

Спасибо за ссылку - я подтвердил ваш ответ –

+0

Кажется, он предназначен для стиля XP (Luna), не адаптируется к теме Aero. – 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 theme, что делает ее непоследовательным взглядом на темы классического/не-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 Toolkit для отображения контекстного меню достаточно прямолинейно. Добавьте контекстное меню в ресурсы вашего окна. На загрузке окна - привяжите контекстное меню к кнопке разделения, а затем используйте контекстное меню, как обычно.

Это действительно необходимо добавить в WPF Toolkit, поскольку основной вариант использования этой кнопки - это копирование старой кнопки 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; 
     } 
    } 
}