Setting a WPF ContextMenu's PlacementTarget property in XAML?
You should be setting the ContextMenuService.Placement attached property on the button, as stated in the remarks in the documentation for ContextMenu.Placement.
<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom"> <Button.ContextMenu> <ContextMenu> <MenuItem Header="Bar" /> </ContextMenu> </Button.ContextMenu></Button>
Have you tried this:
<Button Name="btnFoo" Content="Foo"> <Button.ContextMenu> <ContextMenu> <MenuItem Header="Bar" /> </ContextMenu> </Button.ContextMenu></Button>
This will make the ContextMenu open where you right clicked your mouse (on the button).Which I think might be your desired location right?
--- EDIT ---In that case use this:
<Button Name="btnFoo" Content="Foo" ContextMenuOpening="ContextMenu_ContextMenuOpening"> <Button.ContextMenu> <ContextMenu Placement="Bottom"> <MenuItem Header="Bar" /> </ContextMenu> </Button.ContextMenu></Button>
And in code behind:
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;}
You can reuse the method for multiple buttons and ContextMenu's..
You could use a <Menu />
, styled as a Button
and avoid the hassle with the ContextMenuService
.