2 c# wpf contextmenu
我有一个矩形。它rectangle有一个自定义(只是在其中contextmenu进行了一些简单的更改)。我想要的是,单击鼠标左键,将弹出。ControlTemplae<ContextMenu.Template>contextmenu
我尝试添加rectangle1.contextmenu.isopen=true矩形的事件。是的,它MouseDown会打开。但是,它被设置为在矩形的上方(顶部)打开/弹出,我通过简单地添加到矩形的 XAML 来做到这一点。但是如果我在矩形的事件,然后弹出,但在错误的位置,它不再停留在顶部,而是跟随鼠标。例如,如果我单击矩形的右角,则在右侧打开/弹出。这行为很奇怪,我不知道为什么会发生这种情况。contextmenucontextmenuContextMenuService.Placement="top"rectangle1.contextmenu.isopen=trueMouseDowncontextmenucontextmenu
无论如何,如何contextmenu通过单击鼠标左键打开矩形顶部的 ?
更新
奇怪的是,无论我向其中任何一个添加什么代码mouseevent,上下文菜单都会丢失它的位置!例如,如果我什至添加MsgBox("abc")mouseDown 事件,然后右键单击矩形,上下文菜单就不在顶部!
正如我从 MSDN 参考ContextMenu.Placement中看到的
当 ContextMenu 分配给 FrameworkElement.ContextMenu 或 FrameworkContentElement.ContextMenu 属性时,ContextMenuService 在 ContextMenu 打开时更改此属性的值。如果用户使用鼠标打开 ContextMenu,则 Placement 将设置为 MousePoint。如果用户使用键盘打开 ContextMenu,则 Placement 将设置为 Center。如果要更改 ContextMenu 的位置,请设置 FrameworkElement 或 FrameworkContentElement 上的 ContextMenuService.Placement 属性。
因此,由于您不是通过 ContextMenuService 执行此操作,因此您应该自己更改 Placement 和 PlacementTarget。
private void Mouse_Down(object sender, MouseButtonEventArgs e)
{
var cm = ContextMenuService.GetContextMenu(sender as DependencyObject);
if (cm==null)
{
return;
}
cm.Placement = PlacementMode.Top;
cm.PlacementTarget = sender as UIElement;
cm.IsOpen = true;
}
Run Code Online (Sandbox Code Playgroud)