代码之家  ›  专栏  ›  技术社区  ›  kenwarner

在XAML中设置WPF ContextMenu的PlacementTarget属性?

  •  15
  • kenwarner  · 技术社区  · 15 年前
    <Button Name="btnFoo" Content="Foo" >
        <Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo">
            <MenuItem Header="Bar" />
        </Button.ContextMenu>
    </Button>
    

    给我一个运行时错误“uielement”类型没有公共类型转换器类

    我也尝试过

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

    把ContextMenu放在屏幕左上角,而不是按钮上

    3 回复  |  直到 7 年前
        1
  •  25
  •   Tarsier    14 年前

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

    <Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom">
        <Button.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Bar" />
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
    
        2
  •  3
  •   Zenuka    15 年前

    您是否尝试过:

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

    您可以为多个按钮和ContextMenu重用该方法。

        3
  •  0
  •   Lyra    7 年前

    你可以用一个 <Menu /> ,样式为 Button 并避免与 ContextMenuService .