WPF ContextMenu出现在另一个屏幕上

时间:2017-08-09 14:15:17

标签: c# wpf

我正在研究在两台显示器上运行的应用程序。我在Windows中定义了两个屏幕。在我的WPF应用程序中,我在Screen1上打开了一个窗口,在Screen2上打开了第二个窗口。第二个窗口包含每个都带有ContextMenu的图像。在图像的click事件上,我调用EnableLeftClick方法。

由于某些奇怪的原因,上下文菜单出现在第一个屏幕上的随机位置。我调用此方法是因为我需要在鼠标左键单击时打开上下文菜单。我尝试使用PlacementTarget,我尝试使用ContextMenuService,但没有任何工作。如何强制ContextMenu准确打开单击鼠标的位置?我尝试将PlacementMode设置为Mouse和MousePoint,但始终获得相同的结果。它出现在另一个屏幕上。

    private void EnableLeftClick(object sender)
    {
        var fe = sender as FrameworkElement;
        if (fe != null)
        {
            if (fe.ContextMenu == null) return;
            //fe.ContextMenu.PlacementTarget = fe;
            //fe.ContextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
            //fe.ContextMenu.HorizontalOffset = 0;
            //fe.ContextMenu.VerticalOffset = 0;
            System.Windows.Controls.ContextMenuService.SetPlacement(fe, System.Windows.Controls.Primitives.PlacementMode.Bottom);
            fe.ContextMenu.IsEnabled = true;
            fe.ContextMenu.IsOpen = true;
            fe.ContextMenu.Visibility = Visibility.Visible;
        }
    }

更糟糕的是,当我点击屏幕上的其他地方时,ContextMenu甚至都没有关闭。

ContextMenu在此方法中初始化,该方法在Window打开时执行。我基本上在几个图像上附加了不同的ContextMenu。

    public void DoDynamicMenus()
    {
        m_menuService = GcsIocContainer.Instance.Container.Resolve<IMenuIntegrationService>();

        foreach (var menuConfiguration in m_menuService.GetMenuConfigurations())
        {
            foreach (var image in GetImageComponents<IAlsGraphic>(m_components))
            {
                if (menuConfiguration.RootImageName.Equals(image.Name, StringComparison.InvariantCultureIgnoreCase))
                {
                    var contextMenu = new System.Windows.Controls.ContextMenu();
                    var fe = image.NativeObject as FrameworkElement;
                    foreach (var mi in menuConfiguration.GetRootMenuItems())
                    {
                        var menuItem = new System.Windows.Controls.MenuItem() { Header = mi.ItemCaption };
                        menuItem.Click += MenuItem_Click;
                        contextMenu.Items.Add(menuItem);
                        menuItem.Tag = mi;
                    }
                    fe.ContextMenu = contextMenu;
                    //fe.ContextMenu.Visibility = Visibility.Visible;
                    fe.Visibility = Visibility.Visible;
                    contextMenu.IsEnabled = true;
                    contextMenu.IsOpen = true;
                }
            }
        }
    }

0 个答案:

没有答案