左键单击wpf c#

时间:2018-02-26 15:01:36

标签: c# wpf contextmenu

我有一个矩形。rectangle有一个自定义contextmenu(只是ControlTemplae <ContextMenu.Template>内的一些简单更改。我想要的是,左边单击鼠标,将弹出contextmenu

我尝试在矩形的rectangle1.contextmenu.isopen=true事件中添加MouseDown。是的,它会打开contextmenu。但是,contextmenu设置为在上方打开/弹出(在矩形的顶部,我只需将ContextMenuService.Placement="top"添加到矩形的XAML中即可。但如果我在矩形的rectangle1.contextmenu.isopen=true事件中使用MouseDown,则弹出contextmenu但是在错误的地方,它不再保持在顶部,而是跟随鼠标.Eg如果我点击矩形的右角,contextmenu会在右边打开/弹出。这种行为很奇怪,我不知道为什么会这样。

无论如何,如何在鼠标左键单击矩形顶部打开contextmenu

更新

奇怪的是,无论我添加到任何mouseevent的代码,上下文菜单都会丢失它的位置!例如,如果我在mouseDown事件上添加MsgBox("abc"),然后右键单击矩形,则上下文菜单不在顶部!!

2 个答案:

答案 0 :(得分:3)

正如我在MSDN参考ContextMenu.Placement

中看到的那样
  

将ContextMenu分配给FrameworkElement.ContextMenu时   或FrameworkContentElement.ContextMenu属性,   ContextMenuService在更改此属性的此值时   ContextMenu打开。如果用户使用打开ContextMenu   鼠标,Placement设置为MousePoint。如果用户打开了   ContextMenu通过使用键盘,Placement设置为Center。如果你   想要改变ContextMenu的位置,设置   FrameworkElement上的ContextMenuService.Placement属性   FrameworkContentElement上。

因此,由于您不是通过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;
}

答案 1 :(得分:1)

我认为这就是你要去做的事情?

rect.ContextMenu.PlacementTarget = rect;

rect.ContextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Top;
rect.ContextMenu.IsOpen = true;

// if you want it to be at the top and come down over the rectangle
rect.ContextMenu.VerticalOffset = rect.ContextMenu.ActualHeight;