2009-09-11 12 views
20

Ich habe gerade einen sehr frustrierenden Nachmittags-Google-Trawling auf der Suche nach einem kommerziellen WPF SplitButton Steuerelement, das in einem ToolBar arbeiten wird verbracht. A SplitButton ist eine, wo Sie auf den Hauptteil der Button klicken können, um eine Standardaktion auszuführen, oder klicken Sie auf ein kleines Dreieck auf der rechten Seite, um ein Dropdown-Menü mit alternativen Aktionen zu erhalten).WPF SplitButton?

Ich habe mehrere im Web gefunden (einschließlich der auf CodeProject und die beiden auf CodePlex). Keine von ihnen funktioniert ordnungsgemäß in einem ToolBar - sie entweder überhaupt nicht angezeigt werden, oder sie haben keine Symbolleiste Button-Styling. Ich schaute mir sogar einige kommerzielle Angebote an, wie ActiPro's Popup-Button (in ihrer SharedLibrary DLL). Gleiche Probleme.

Und ja, ich habe alle Beiträge darüber gesehen, wie einfach es ist, einen zu erstellen. Es ist sehr einfach, einen schlechten Code zu erstellen, aber nicht so einfach, einen zu erstellen, der aussieht und funktioniert wie der SplitButton in Outlook oder Visual Studio, wo das Dropdown-Menü nicht verschwindet, wenn Sie die Maustaste loslassen.

Also, hier ist meine Frage: Gibt es kommerzielle SplitButton s, entweder Open-Source-oder kommerzielle, die in Symbolleisten arbeiten? Ich bin nicht auf der Suche nach einem Steuerelement, das Teil eines Jahresabonnements von $ 1.500 für jemandes Steuerelemente-Bibliothek ist, aber wenn es einen günstigen Preis SplitButton gibt, würde ich sicher gerne finden.

Antwort

7

Der einzige echte "kommerzielle" Split-Button, den ich kenne, ist der von Syncfusion, der als Teil seiner Ribbon-Steuerung enthalten ist (obwohl er auch außerhalb des Ribbons funktioniert).

Das gesagt, ich erinnere mich an this implementation als recht brauchbar und vollständig, wenn Sie etwas freies suchen.

+0

Ja, ich kam über Zhou Yong-Implementierung in meiner ersten Suche. Leider ist die Quellcodeverbindung unterbrochen. –

+4

Update: Ich schaute wieder auf Zhou Yongs Blog und zog einen Kommentar, wo jemand sagte, dass sie den Quellcode auf Channel9 gefunden hatten. Hier finden Sie es: http://channel9.msdn.com/playground/Sandbox/244830-SplitButton/ –

+0

Beachten Sie, dass Syncfusion jetzt zwei SplitButtons hat: Das * SplitButton *, das Teil ihrer Ribbon-Steuerelemente ist, funktioniert auch gut in ToolBars. Der * SplitButtonAdv * hingegen zeichnet einen "Button-Rahmen" um sich selbst, was bedeutet, dass er nicht optisch in eine ToolBar passt. –

2

Ich weiß nicht, was genau Sie in einem Split-Button suchen, aber dieses Video, wie man einen erstellt, ist ziemlich komplett und macht einen Splitbutton, der fast perfekt ist.

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

Ich weiß, dass Sie nicht ein Tutorial wollten, aber ich habe das vorher benutzt und man kann den Unterschied zwischen ihm und die, in Outlook nicht sagen.

+0

Dieser Link funktioniert nicht mehr. Lee Brimelow scheint verschwunden zu sein, was eine Schande ist. Ich habe das Video mehrmals gesehen, als ich nach einem Knopf gesucht habe, und anscheinend ist das Tutorial ziemlich gut. Wenn Sie auf einen funktionierenden Link stoßen, lassen Sie es mich wissen. Vielen Dank. –

+0

Ah bummer Sie haben Recht. Was für eine Schande - es war eine gute Präsentation. –

+0

Ich habe ihn wegen des Videos kontaktiert. Er scheint jetzt für Adobe zu arbeiten ... hoffentlich wird er bereit sein, diese Videos erneut zu teilen. –

1

Ich denke, was Sie meinen, ist ein DropDownButton. Es gibt eine boolesche Eigenschaft auf MenuItem "StaysOpenOnClick", die Ihr Problem lösen könnte.

+0

Warum -1? war etwas falsch, sagte ich? – codymanix

+5

Ich habe den Downvote nicht eingefügt, aber ich denke, Sie haben die Frage vielleicht falsch verstanden. Eine DropDown-Schaltfläche verlässt das Menü, unabhängig davon, wo sie geklickt wurde. Ein SplitButton hat zwei Regionen. eine Hauptregion und eine Drop-Down-Region. Wenn Sie auf die Hauptregion klicken, wird eine Standardaktion ausgeführt. Wenn Sie auf den Drop-Down-Bereich klicken, wird das Menü geschlossen. Wenn Sie auf der Hauptsymbolleiste von VS 2008 auf die Schaltfläche "Neues Projekt" klicken, sehen Sie ein Beispiel für einen SplitButton. –

+0

David, ja, aber du kannst einen normalen Button neben einen anderen Dropdown-Button setzen, der nur einen Pfeil nach unten enthält, um denselben Effekt zu erreichen – Epirocks

6

Eine weitere gute freie Implementierung, die scheint, alles zu haben:

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

  • Die Split-Schaltfläche in der Symbolleiste verwendet wird und hat einen richtigen Symbolleiste Stil. Es kann auch neu gestaltet werden, wenn Sie möchten.
  • Dropdown-Menü wird über eine eigene Eigenschaft verfügbar gemacht - dh SplitButton kann ein eigenes Kontextmenü haben, das vom Dropdown-Menü getrennt ist (obwohl es unlogisch erscheint, kann es in manchen Fällen nützlich sein - wie Symbolleisten-Kontextmenü, wenn Sie mit der rechten Maustaste klicken) auf einer Schaltfläche in der Symbolleiste platziert).
  • Das Dropdown-Menü ist Standard-ContextMenu - d. H. Inhalt kann datengebunden sein, Menüpunkte neu formatiert usw.
  • Sowohl die Haupt- als auch die Dropdown-Teile der geteilten Schaltfläche haben Befehlseigenschaften zugeordnet.
+0

Danke für den Link - Ich habe deine Antwort geuploadet –

+0

Scheint, für XP Stil (Luna) nur, passt sich nicht dem Aero-Thema an. – floele

3

Es ist eine ziemlich gute Split-Schaltfläche Implementierung für WPF und Silverlight über Delay-Blog:

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

+0

Dies ist die eine, die ich gerade benutze. Es gibt ein paar Probleme mit dieser Implementierung, aber im Vergleich zu den anderen da draußen denke ich, dass es am nettesten aussieht und am einfachsten ist. – jpierson

+0

Ja, das einzige Problem, das ich gerade gesehen habe, ist, dass es sich direkt auf die Aero-Themen-Assemblies bezieht, wodurch es inkonsistent zu klassischen/nicht-Aero-Themen wird. – huseyint

3

Die Extended WPF Toolkit Community Edition (das ist kostenlos) hat eine schöne SplitButton (und es hat eine DropDownButton auch

)

SplitButton screen capture

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

Bevor jemand es versucht, versucht es: Diese Implementierung ist nicht sehr nützlich, weil es nur Unterstützung für das Hinzufügen "beliebiger" Inhalte im Dropdown-Bereich bietet. Ein aktuelles Menü (wie 99% aller geteilten Tasten wäre wie) das sieht aus wie eins ist nicht möglich :( – floele

0

Ich war auf der Suche nach dem gleichen und nur gerollt mein eigenes (Sie müssen nach Ihren Wünschen anpassen (um die ToolBar zu entsprechen) und Sie könnten es umgestalten/in ein benutzerdefiniertes Steuerelement konvertieren ... 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> 
0

Die Verwendung der WPF Toolkit Split-Schaltfläche zum Anzeigen eines Kontextmenüs ist relativ einfach. Fügen Sie in Ihren Fensterressourcen ein Kontextmenü hinzu. Im Fenster laden - binden Sie das Kontextmenü an die Split-Schaltfläche und verwenden Sie dann das Kontextmenü wie gewohnt.

Es muss wirklich im WPF-Toolkit hinzugefügt werden, da der Hauptanwendungsfall für diese Schaltfläche die Replizierung der alten WinForm-Schaltfläche ist.

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> 

-Code hinter:

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