【问题标题】:Setting a WPF ContextMenu's PlacementTarget property in XAML?在 XAML 中设置 WPF ContextMenu 的 PlacementTarget 属性?
【发布时间】:2010-11-19 07:48:08
【问题描述】:
<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 放在我屏幕的左上角,而不是在按钮上

【问题讨论】:

    标签: wpf xaml button contextmenu


    【解决方案1】:

    您可以使用&lt;Menu /&gt;,样式为Button,避免使用ContextMenuService 的麻烦。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • @VitalyB:正如 MSDN 文档所述,PlacementTarget 属性会在上下文菜单打开时更改(更改为 MousePoint 或 Center,具体取决于用户打开菜单的方式)。因此,在属性上设置绑定将不起作用 - 它将被更改。
      • 哦...我明白了。他们应该将其标记为只读,这样就不会那么混乱了。谢谢!
      • 当它被实现时,右键菜单会出现在鼠标右键上。是否可以在鼠标左键单击时显示上下文菜单?提前致谢。
      【解决方案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;
      }
      

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

      【讨论】:

      • 我很久以前从事的项目开始使用 Buttons 和 ContextMenus 来创建 ComboBox 效果。虽然这可能有点傻,但现在改变它为时已晚。所以我希望 ContextMenu 在 Button 下方打开,而不是在实际发生点击的地方。
      • 当这个实现时,右键菜单会出现在鼠标右键。鼠标左键是否可以实现相同的功能?提前致谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多