WPF SplitButton?
Я только что потратил очень неудачный послеобеденный траловый Google, ищущий коммерческий WPF SplitButton
, который будет работать в ToolBar
. A SplitButton
- это тот, где вы можете щелкнуть основную часть Button
, чтобы принять действие по умолчанию, или щелкнуть по маленькому треугольнику справа, чтобы получить раскрывающееся меню альтернативных действий).
Я нашел несколько в Интернете (в том числе и на CodeProject, и в том числе на CodePlex). Ни один из них не работает должным образом в ToolBar
- они либо вообще не появляются, либо у них нет стиля кнопок на панели инструментов. Я даже посмотрел на некоторые коммерческие предложения, такие как всплывающая кнопка ActiPro (в их SharedLibrary DLL). Те же проблемы.
И да, я видел все сообщения о том, как легко создать его. Очень просто создать плохой, но не так просто создать тот, который выглядит и работает как SplitButton
в Outlook или Visual Studio, где раскрывающееся меню не исчезает, если вы отпустите кнопку мыши.
Итак, вот мой вопрос: есть ли какой-либо коммерческий класс SplitButton
, открытый или открытый, который работает в панелях инструментов? Я не ищу элемент управления, который является частью ежегодной подписки на 1500 долларов для кого-то, контролирующего библиотеку, но если есть разумная цена SplitButton
, я бы точно ее нашел.
Ответы
Ответ 1
Единственная истинная кнопка разделения "коммерческого класса", о которой я знаю, - это Syncfusion, которая включена как часть их ленточное управление (хотя оно работает и за пределами ленты).
Это, как говорится, я помню эту реализацию как достаточно полезную и полную, если вы ищете что-то бесплатное.
Ответ 2
Еще одна хорошая бесплатная реализация, которая, кажется, имеет все:
http://huydinhpham.blogspot.com/2008/09/wpf-drop-down-and-split-button.html
- Кнопка разделения может использоваться на панели инструментов и имеет подходящий стиль панели инструментов. Он также может быть рестайлингом, если вы хотите.
- Выпадающее меню открывается через свое собственное свойство - т.е. функция splitbutton может иметь собственное контекстное меню отдельно от раскрывающегося списка (хотя в некоторых случаях это кажется нелогичным, что может быть полезно в некоторых случаях - например, контекстное меню панели инструментов, которое появляется при щелчке правой кнопкой мыши на кнопке, расположенной на панели инструментов).
- Выпадающее меню является стандартным ContextMenu - то есть контент может быть привязан к базе данных, элементы меню рестайлинг и т.д.
- Как основная, так и выпадающая части кнопки разделения имеют связанные с ними свойства команд.
Ответ 3
Для WPF и Silverlight over Delay существует довольно хорошая реализация с разделенной кнопкой:
Banana SplitButton (специфическое для WPF исправление для SplitButton и некоторые улучшения анализа кода для версии Silverlight)
Ответ 4
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
Я не знаю, что именно вы ищете в сплите-кнопке, но это видео о том, как его создать, довольно полно и делает splitbutton, который почти идеален.
http://windowsclient.net/learn/video.aspx?v=3929
Я знаю, что вам не нужен учебник, но я использовал это раньше, и вы не могли отличить его от того, что было в Outlook.
Ответ 6
Я думаю, что вы имеете в виду, называется DropDownButton.
В MenuItem "StaysOpenOnClick" существует логическое свойство, которое может решить вашу проблему.
Ответ 7
Я искал то же самое и просто скакал самостоятельно (вам нужно будет по вкусу (в соответствии с 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>
Ответ 8
Использование кнопки разделения WPF Toolkit для отображения контекстного меню достаточно прост. Добавьте контекстное меню в ресурсы вашего окна. В окне загрузки - привяжите контекстное меню к кнопке разделения, а затем используйте контекстное меню, как обычно.
Это действительно нужно добавить в WPF Toolkit, поскольку основной вариант использования этой кнопки - это репликация старой кнопки 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;
}
}
}