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

给了我一个运行时错误“的UIElement”类型不具有公共的TypeConverter类在XAML中设置WPF ContextMenu的PlacementTarget属性?

我也试过

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

,并且把文本菜单在我的屏幕的左上角,而比按钮

回答

23

您应该在按钮上设置ContextMenuService.Placement附加属性,如ContextMenu.Placement文档中的注释所述。

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

完美,谢谢! – kenwarner 2010-06-18 17:32:09

+0

我很困惑。为什么没有PlacementElement绑定工作? – VitalyB 2011-02-09 12:44:51

+1

@VitalyB:正如MSDN文档所述,当上下文菜单打开时(根据用户打开菜单的方式将鼠标点或中心打开),PlacementTarget属性会发生更改。因此,在属性上设置绑定将不起作用 - 它将被更改。 – Tarsier 2011-02-09 16:46:02

3

你有没有尝试过这样的:

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

这会使ContextMenu在您右键单击鼠标的位置打开(在按钮上)。 我认为这可能是你想要的位置吗?

---编辑--- 在这种情况下使用:

<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; 
} 

您可以重复用于多个按钮的方法和文本菜单的..

+1

我很久以前开始使用Buttons和ContextMenus来创建ComboBox效果。虽然这可能有点愚蠢,但现在改变它为时已晚。所以我想让ContextMenu在按钮下方打开,而不是实际发生点击的地方。 – kenwarner 2009-08-13 20:30:17

+0

编辑应该做的诀窍... – Zenuka 2009-08-14 07:41:41

+0

当这个被实现时,上下文菜单出现在鼠标右键上。左键单击鼠标可以实现相同的功能吗?提前致谢。 – samar 2011-05-30 08:04:23

0

你可以使用一个<Menu />,风格为Button并避免与ContextMenuService麻烦。