Setting a WPF ContextMenu's PlacementTarget property in XAML?
23,290
Solution 1
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>
Solution 2
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..
Author by
Ankur
i write software for a living. someday a robot is going to take my job. i can't wait.
Updated on July 09, 2022Comments
-
Ankur almost 2 years
<Button Name="btnFoo" Content="Foo" > <Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo"> <MenuItem Header="Bar" /> </Button.ContextMenu> </Button>
gives me a runtime error 'UIElement' type does not have a public TypeConverter class
I also tried
<Button Name="btnFoo" Content="Foo" > <Button.ContextMenu Placement="Bottom" PlacementTarget="{Binding ElementName=btnFoo}"> <MenuItem Header="Bar" /> </Button.ContextMenu> </Button>
and that put the ContextMenu in the top left corner of my screen, rather than at the Button