2009-08-13 4 views
13
<Button Name="btnFoo" Content="Foo" > 
    <Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo"> 
     <MenuItem Header="Bar" /> 
    </Button.ContextMenu> 
</Button> 

gibt mir einen Laufzeitfehler ‚UIElement‘ Typ eine Klasse public Typeconverter in der linken oberen Ecke meines Bildschirms,Festlegen der PlacementTarget-Eigenschaft eines WPF ContextMenu in XAML?

Ich habe auch versucht

<Button Name="btnFoo" Content="Foo" > 
    <Button.ContextMenu Placement="Bottom" PlacementTarget="{Binding ElementName=btnFoo}"> 
     <MenuItem Header="Bar" /> 
    </Button.ContextMenu> 
</Button> 

und dass die ContextMenu setzen nicht lieber am Knopf als

Antwort

23

Sie sollten die angefügte ContextMenuService.Placement-Eigenschaft auf der Schaltfläche festlegen, wie in den Anmerkungen in der Dokumentation für ContextMenu.Placement angegeben.

<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 
+0

perfekt, danke! – kenwarner

+0

Ich bin verwirrt. Warum funktioniert die PlacementElement-Bindung nicht? – VitalyB

+1

@VitalyB: Wie die MSDN-Dokumentation angibt, wird die PlacementTarget-Eigenschaft beim Öffnen des Kontextmenüs geändert (je nachdem, wie der Benutzer das Menü öffnet, entweder zu MousePoint oder zu Center). Aus diesem Grund wird das Festlegen einer Bindung für die Eigenschaft nicht funktionieren - sie wird geändert. – Tarsier

3

Haben Sie versucht, diese:

<Button Name="btnFoo" Content="Foo"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Dadurch wird das ContextMenu geöffnet, wo Sie mit der rechten Maustaste geklickt haben (auf der Schaltfläche). Welche ich denke, könnte Ihre gewünschte Position sein, oder?

--- EDIT --- In diesem Fall verwenden:

<Button Name="btnFoo" Content="Foo" ContextMenuOpening="ContextMenu_ContextMenuOpening"> 
    <Button.ContextMenu> 
     <ContextMenu Placement="Bottom"> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Und hinter in Code:

private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e) 
{ 
    // Get the button and check for nulls 
    Button button = sender as Button; 
    if (button == null || button.ContextMenu == null) 
     return; 
    // Set the placement target of the ContextMenu to the button 
    button.ContextMenu.PlacementTarget = button; 
    // Open the ContextMenu 
    button.ContextMenu.IsOpen = true; 
    e.Handled = true; 
} 

Sie können die Methode für mehrere Tasten und ContextMenu die Wiederverwendung ..

+1

Das Projekt, an dem ich vor langer Zeit gearbeitet habe, begann mit Buttons und ContextMenus einen ComboBox-Effekt zu erstellen. Während das wahrscheinlich ein wenig albern ist, ist es zu spät, um es jetzt zu ändern. Daher möchte ich, dass das ContextMenu unterhalb des Buttons geöffnet wird und nicht dort, wo der Klick tatsächlich stattgefunden hat. – kenwarner

+0

Die Änderung sollte den Trick tun ... – Zenuka

+0

Wenn dies implementiert ist, kommt das Kontextmenü auf den rechten Mausklick. Ist es möglich, die gleiche Funktionalität mit einem linken Mausklick zu erreichen? Danke im Voraus. – samar

0

Sie könnten ein <Menu />, gestylt als Button nutzen und den Streit mit den ContextMenuService vermeiden.