2009-09-11 9 views
20

Właśnie spędziłem bardzo frustrujące popołudnie, trałując Google'a szukającego komercyjnej klasy WPF SplitButton kontroli, która zadziała w ToolBar. A SplitButton to taki, w którym można kliknąć główną część Button, aby wykonać domyślną akcję, lub kliknąć mały trójkąt po prawej stronie, aby uzyskać menu rozwijane alternatywnych działań).WPF SplitButton?

Znalazłem kilka w Internecie (w tym jeden na CodeProject, a dwa na CodePlex). Żadna z nich nie działa poprawnie w postaci ToolBar - wcale się nie pojawiają lub nie mają stylu paska narzędzi. Spojrzałem nawet na niektóre oferty komercyjne, takie jak wyskakujący przycisk ActiPro (w bibliotece SharedLibrary DLL). Te same problemy.

I tak, widziałem wszystkie posty o tym, jak łatwo jest je stworzyć. Bardzo łatwo jest stworzyć złe, ale nie tak łatwe do stworzenia, które wygląda i działa tak jak SplitButton s w programie Outlook lub Visual Studio, gdzie rozwijane menu nie znika po zwolnieniu przycisku myszy.

Oto moje pytanie: czy są tam dostępne komercyjne urządzenia o klasie komercyjnej i komercyjnej, które działają na paskach narzędzi? Nie szukam kontroli, która jest częścią rocznej subskrypcji 1500 $ na czyjąś bibliotekę kontrolną, ale jeśli jest dostępna rozsądna cena SplitButton, z pewnością ją znajdę.

Odpowiedz

7

Jedynym prawdziwym "dzielonym" znakiem handlowym, o którym mi wiadomo, jest ten o numerze Syncfusion, który jest częścią jego kontrolek wstążki (chociaż działa również poza wstążką).

Biorąc to pod uwagę, pamiętam, że this implementation jest dość użyteczny i kompletny, jeśli szukasz czegoś za darmo.

+0

Tak, natknąłem realizacji Zhou Yong w moim początkowym wyszukiwania. Niestety link kodu źródłowego jest uszkodzony. –

+4

Aktualizacja: Spojrzałem ponownie na blog Zhou Yonga i polubiłem komentarz, w którym ktoś powiedział, że znalazł kod źródłowy na Channel9. Znalazłem go tutaj: http://channel9.msdn.com/playground/Sandbox/244830-SplitButton/ –

+0

Pamiętaj, że Syncfusion ma teraz dwa SplitButtons: * SplitButton *, który jest częścią ich kontrolek wstążki, również działa dobrze w Paski narzędzi. Natomiast * SplitButtonAdv * rysuje wokół siebie "obramowanie przycisku", co oznacza, że ​​nie pasuje wizualnie do paska narzędzi. –

2

Nie wiem, czego dokładnie szukasz w podzielonym przycisku, ale ten film wideo na temat tworzenia jest całkiem kompletny i sprawia, że ​​przycisk podziału jest prawie idealny.

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

Wiem, że nie chcesz tutorial, ale użyłem tego wcześniej i nie można było dostrzec różnicę między nim a tymi w programie Outlook.

+0

Ten link już nie działa. Wydaje się, że Lee Brimelow zniknął, co jest wstydem. Widziałem wideo, do którego odsyłałem kilka razy, kiedy szukałem przycisku i najwyraźniej samouczek jest całkiem dobry. Jeśli natrafisz na działający link, daj mi znać. Dzięki. –

+0

Ah bummer masz rację. Co za wstyd - to była dobra prezentacja. –

+0

Skontaktowałem się z nim w sprawie filmu. Wydaje się, że teraz pracuje dla Adobe ... mam nadzieję, że będzie chciał ponownie udostępnić te filmy. –

1

Myślę, że to, co masz na myśli, nazywa się DropDownButton. Istnieje właściwość boolean w MenuItem "StaysOpenOnClick", która może rozwiązać problem.

+0

Dlaczego -1? Coś nie tak powiedziałem? – codymanix

+5

Nie wprowadziłem do porządku, ale myślę, że źle zrozumiałeś pytanie. Przycisk DropDown opuszcza menu bez względu na to, gdzie zostanie kliknięty. SplitButton ma dwa regiony; region główny i region rozwijany. Jeśli klikniesz na główny region, przycisk przyjmie domyślną akcję. Jeśli klikniesz na rozwijany region, to opuści ono menu. Jeśli spojrzysz na przycisk "Nowy projekt" na głównym pasku narzędzi VS 2008, zobaczysz przykład przycisku SplitButton. –

+0

David, tak, ale możesz umieścić normalny przycisk obok innego przycisku rozwijanego, który ma tylko ikonę strzałki w dół, aby osiągnąć ten sam efekt. – Epirocks

6

Innym dobrym wolnej implementacji, które wydają się mieć wszystko:

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

  • Przycisk podziału może być stosowany w narzędziach i ma właściwego stylu paska narzędzi. Można go również zmienić, jeśli chcesz.
  • Menu rozwijane jest wyeksponowane za pośrednictwem własnej właściwości - tzn. Przycisk split może mieć własne menu kontekstowe oddzielone od menu rozwijanego (nawet jeśli wydaje się nielogiczne, może być przydatne w niektórych przypadkach - takie jak menu kontekstowe paska narzędzi, które pojawia się po kliknięciu prawym przyciskiem myszy na przycisku umieszczonym na pasku narzędzi).
  • Menu rozwijane jest standardowym ContextMenu - tzn. Treścią może być databound, restulowane elementy menu itp.
  • Zarówno główna, jak i rozwijana część przycisku podziału mają powiązane z nimi właściwości polecenia.
+0

Dzięki za link - przejąłem Twoją odpowiedź. –

+0

Wygląda na to, że został zaprojektowany dla stylu XP (Luna), nie dostosowuje się do motywu Aero. – floele

3

Jest to całkiem dobry Podział realizacja przycisk dla WPF i Silverlight na blogu opóźnienie w:

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

+0

To jest ten, którego aktualnie używam. Jest kilka problemów związanych z tą implementacją, ale w porównaniu z innymi, uważam, że jest najładniejsza i najprostsza. – jpierson

+0

Tak, jednym z problemów, który obecnie widziałem, jest to, że bezpośrednio odwołuje się do zespołów motywu Aero, co powoduje, że ma niespójne spojrzenie na motywy klasyczne/nie-Aero. – huseyint

3

Extended WPF Toolkit Community Edition (co jest darmowe) ma ładny SplitButton (i ma DropDownButton także)

SplitButton screen capture

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

Zanim ktokolwiek będzie się starał spróbować: ta implementacja nie jest zbyt użyteczna, ponieważ obsługuje tylko dodawanie "dowolnej" zawartości w obszarze rozwijanym. Rzeczywiste menu (na przykład 99% wszystkich podzielonych przycisków), które wygląda jak jeden, nie jest możliwe :( – floele

0

Szukałem tego samego i właśnie wyrzuciłem swoje własne (będziesz musiał dopasować do swoich upodobań (aby pasować do ToolBar) i możesz go zmienić/przekształcić w niestandardową kontrolkę ... itd.)

<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

Używanie przycisku podziału pakietu WPF Toolkit do wyświetlania menu kontekstowego jest dość proste. Dodaj menu kontekstowe do zasobów twojego okna. Przy obciążeniu okna - należy powiązać menu kontekstowe z przyciskiem podziału, a następnie użyć menu kontekstowego, tak jak normalnie.

To naprawdę musi być dodane w zestawie narzędzi WPF, ponieważ większościowym zastosowaniem tego przycisku jest replikacja starego przycisku 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> 

Kod za:

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