我正在研究在两台显示器上运行的应用程序。我在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;
}
}
}
}