2014-04-11 5 views
11

Pro this page verwendet DropDownButton ein ContextMenu, um die ItemsSource anzuzeigen. Wie können wir wissen, worauf der Benutzer klickt? Das Click-Ereignis auf der Schaltfläche gilt nicht für das Menü, sondern für die Schaltfläche selbst. Ich sehe keine anderen Ereignisse darauf.Wissen, was in einem DropDownButton geklickt wird

+0

Überprüfen Sie diese Ereignisse: 'DropDownOpened/DropDownClosed',' ContextMenuOpening/ContextMenuClosing'. –

+0

Verwenden Sie keine Ereignisse in WPF. Es besteht die Möglichkeit, dass das Steuerelement eine 'SelectedItem' -Eigenschaft hat, oder dass Sie' Command's jedem Element zuweisen können, wie Sie es in einem normalen 'Menu' tun würden. –

+0

@HighCore: Der DropDownButton ist, Zitat: 'Dieses Steuerelement fast das gleiche wie SplitButton mit wenigen Unterschieden: Es hat keine SelectedItem und SelectedIndex Eigenschaften und hat auch kein SelectionChanged-Ereignis. –

Antwort

0

Erstellen Sie eine zum ContextMenu/DropDownButton (je nachdem, was Sie bevorzugen). Wenn Sie das Dropdown-Menü aufgerufen haben, rufen Sie das Kontextmenü auf, das angezeigt wird, verbinden Sie dann die Click-Ereignisse und drücken Sie den Wert zurück auf die Eigenschaft.

3

können Sie überschreiben die Elementvorlage für die Steuerung und kann einen Handler in der es wie folgt hinzu:

<controls:DropDownButton Content="Select me" x:Name="selectMeDropDownButton"> 
    <controls:DropDownButton.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" MouseDown="selectMeDropDownButton_TextBlock_MouseDown" /> 
     </DataTemplate> 
    </controls:DropDownButton.ItemTemplate> 
</controls:DropDownButton> 

und den Event-Handler in implementieren Code-Behind-Datei wie folgt:

void selectMeDropDownButton_TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ChangedButton == MouseButton.Left && this.selectMeDropDownButton.IsExpanded) 
    { 
     var value = ((TextBlock)e.Source).DataContext; 
     // Do something meaningful with the value, it's an item from ItemsSource 
    } 
} 

Die Überprüfung für DropDownButton.IsExpanded ist erforderlich, da das gleiche ItemTemplate auf die Content auf der Schaltfläche selbst angewendet wird. Natürlich können Sie TextBlock durch beliebige Control/UIElement ersetzen.

+0

IMO ist es besser '' MenuItem Click = "..." /> 'anstelle von' 'in' 'DataTemplate />' zu verwenden. – xmedeko

14

Ich stieß auf diese Frage auf der Suche nach der gleichen Antwort. Ich habe nie wirklich etwas online gefunden, aber ich habe diese Lösung selbst entdeckt. Vielleicht wird es jemandem in der Zukunft helfen.

Wie bereits erwähnt, verwendet die DropDownButton eine ContextMenu, um ihre ItemsSource anzuzeigen. Was ich eigentlich suchte, war ein "menüähnlicher" Drop-Down von einem Button. Angenommen, Sie haben eine DropDownButton, die "Add" sagt. Vielleicht möchten Sie 2 Optionen wie "Add New" und "Add Existing". Also das ist was ich getan habe ...

Zuerst habe ich ein Objekt gemacht, um den Header/Inhalt und den Befehl zu halten.

public class TitledCommand 
{ 
    public String Title { get; set; } 
    public ICommand Command { get; set; } 
} 

Theoretisch würden Sie eine Liste dieser auf die ItemsSource des DropDownButton zu binden.

public List<TitledCommand> TitledCommmands { get; private set; } 

Jetzt Stil, den wir gerade das Einzelteil Container für die DropDownButton so nimmt es den Header und Befehl von unseren Objekten im ItemsSource.

Fügen MahApps:

xmlns:metroControls="http://metro.mahapps.com/winfx/xaml/controls" 

Und hier ist der Stil ...

<metroControls:DropDownButton Content="Add" ItemsSource="{Binding Path=TitledCommmands}"> 
    <metroControls:DropDownButton.ItemContainerStyle>   
     <Style TargetType="MenuItem"> 
      <Setter Property="Header" Value="{Binding Path=Title}"/> 
      <Setter Property="Command" Value="{Binding Path=Command}"/> 
     </Style>   
    </metroControls:DropDownButton.ItemContainerStyle> 
</metroControls:DropDownButton> 
+1

In meinem Fall mit '' funktionierte nicht, und DisplayMemberPath Attribut war besser, aber Sie sind ein Lebensretter sowieso;) – kwesolowski

+1

Dieser sollte akzeptiert werden Antworten. –

+0

Schön gemacht! thx – petric

-1

Verwenden SplitButton statt Dropdownbutton. Der erste hat SelectionChanged-Ereignis.

+2

Ja, aber sie haben nicht das gleiche Gefühl beim Anklicken ... – petric

Verwandte Themen