wpf - metro - style mahapps
WPF SplitButton? (8)
Acabo de pasar una tarde muy frustrante buscando en Google un control WPF SplitButton
calidad SplitButton
que funcione en una ToolBar
. Un SplitButton
es aquel en el que puede hacer clic en la parte principal del Button
para realizar una acción predeterminada, o hacer clic en un pequeño triángulo a la derecha para obtener un menú desplegable de acciones alternativas.
Encontré varios en la web (incluido el de CodeProject, e incluyo los dos en CodePlex). Ninguno de ellos funciona correctamente en una barra de ToolBar
; tampoco aparecen en absoluto, o no tienen el estilo de botón de la barra de herramientas. Incluso miré algunas ofertas comerciales, como el botón emergente de ActiPro (en su DLL SharedLibrary). Mismos problemas
Y sí, he visto todas las publicaciones sobre lo fácil que es crear una. Es muy fácil crear uno malo, pero no es tan fácil crear uno que se vea y funcione como los SplitButton
en Outlook o Visual Studio, donde el menú desplegable no desaparece si suelta el botón del mouse.
Entonces, aquí está mi pregunta: ¿hay algún SplitButton
comercial de grado SplitButton
, ya sea de código abierto o comercial, que funcione en barras de herramientas? No estoy buscando un control que sea parte de una suscripción anual de $ 1,500 a la biblioteca de controles de alguien, pero si hay un SplitButton
precio SplitButton
, me gustaría encontrarlo.
Creo que lo que quieres decir se llama DropDownButton. Hay una propiedad booleana en MenuItem "StaysOpenOnClick" que podría resolver su problema.
El único botón verdadero de "grado comercial" que conozco es el de Syncfusion , que se incluye como parte de sus controles de cinta (aunque también funciona fuera de la cinta).
Dicho esto, recuerdo que esta implementación es bastante útil y completa, si estás buscando algo gratis.
El WPF Toolkit Community Edition extendido (que es gratis) tiene un buen SplitButton
(y también tiene un DropDownButton
)
<xctk:SplitButton Content="Click Me">
<xctk:SplitButton.DropDownContent>
<xctk:ColorCanvas />
</xctk:SplitButton.DropDownContent>
</xctk:SplitButton>
Estaba buscando lo mismo y acabo de rodar el mío (tendrá que diseñar a su gusto (para que coincida con la Barra de herramientas) y podría refactorizarlo / convertirlo en un control personalizado ... etc.)
<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>
Hay una implementación bastante buena de botón dividido para WPF y Silverlight sobre el blog de Delay:
No sé exactamente qué estás buscando en un botón dividido, pero este video sobre cómo crear uno es bastante completo y hace un botón dividido que es casi perfecto.
http://windowsclient.net/learn/video.aspx?v=3929
Sé que no querías un tutorial, pero lo he usado antes y no puedes distinguir entre él y los que están en perspectiva.
Otra buena implementación gratuita que parece tenerlo todo:
http://huydinhpham.blogspot.com/2008/09/wpf-drop-down-and-split-button.html
- El botón dividir se puede utilizar en la barra de herramientas y tiene un estilo de barra de herramientas adecuado. También puede rediseñarse si lo desea.
- El menú desplegable se expone a través de su propia propiedad, es decir, splitbutton puede tener su propio menú contextual separado del menú desplegable (aunque parece ilógico, puede ser útil en algunos casos), como el menú contextual de la barra de herramientas que aparece al hacer clic derecho en un botón colocado en la barra de herramientas).
- El menú desplegable es ContextMenu estándar, es decir, el contenido puede estar enlazado a datos, elementos de menú rediseñados, etc.
- Tanto la parte principal como la parte desplegable del botón de división tienen propiedades de comando asociadas a ellas.
Usar el botón de división de WPF Toolkit para mostrar un menú contextual es razonablemente sencillo. Agregue un menú contextual en sus recursos de ventana. En la ventana de carga: enlace el menú contextual al botón dividir y luego use el menú contextual como lo haría normalmente.
Realmente necesita ser agregado en el WPF Toolkit ya que el caso de uso mayoritario para este botón es replicar el viejo botón 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>
Código detrás:
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;
}
}
}