Настройка свойства WPF ContextMenu PlacementTarget в XAML?
<Button Name="btnFoo" Content="Foo" >
<Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo">
<MenuItem Header="Bar" />
</Button.ContextMenu>
</Button>
дает мне ошибку времени выполнения. Тип UIElement не имеет общедоступного класса TypeConverter
Я также пробовал
<Button Name="btnFoo" Content="Foo" >
<Button.ContextMenu Placement="Bottom" PlacementTarget="{Binding ElementName=btnFoo}">
<MenuItem Header="Bar" />
</Button.ContextMenu>
</Button>
и это положит ContextMenu в верхнем левом углу экрана, а не на кнопку
Ответы
Ответ 1
Вы должны установить прикрепленное свойство ContextMenuService.Placement на кнопке, как указано в примечаниях в документации для ContextMenu.Placement.
<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="Bar" />
</ContextMenu>
</Button.ContextMenu>
</Button>
Ответ 2
Вы пробовали это:
<Button Name="btnFoo" Content="Foo">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="Bar" />
</ContextMenu>
</Button.ContextMenu>
</Button>
Это приведет к тому, что ContextMenu откроется, когда вы щелкнули правой кнопкой мыши (на кнопке).
Который, я думаю, может быть вашим желаемым местом?? //
--- EDIT ---
В этом случае используйте это:
<Button Name="btnFoo" Content="Foo" ContextMenuOpening="ContextMenu_ContextMenuOpening">
<Button.ContextMenu>
<ContextMenu Placement="Bottom">
<MenuItem Header="Bar" />
</ContextMenu>
</Button.ContextMenu>
</Button>
И в коде позади:
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;
}
Вы можете повторно использовать метод для нескольких кнопок и ContextMenu..
Ответ 3
Вы можете использовать <Menu />
, созданный как Button
, и избегать проблем с ContextMenuService
.