atl*_*teh 5 c# multiple-monitors notifyicon winforms toolstripdropdown
我有一个应用程序,主要是通过 NotifyIcon 的 ContextMenuStrip 操作的
,ToolStripMenuItems 有多个级别,用户可以通过它们。
问题是,当用户有两个屏幕时,如果没有可用空间,MenuItems 会跳转到第二个屏幕。像这样:

我怎样才能强迫他们留在同一个屏幕上?我试图通过网络搜索,但找不到合适的答案。
这是我用来测试这个 senario 的一段示例代码:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        var resources = new ComponentResourceManager(typeof(Form1));
        var notifyIcon1 = new NotifyIcon(components);
        var contextMenuStrip1 = new ContextMenuStrip(components);
        var level1ToolStripMenuItem = new ToolStripMenuItem("level 1 drop down");
        var level2ToolStripMenuItem = new ToolStripMenuItem("level 2 drop down");
        var level3ToolStripMenuItem = new ToolStripMenuItem("level 3 drop down");
        notifyIcon1.ContextMenuStrip = contextMenuStrip1;
        notifyIcon1.Icon = ((Icon)(resources.GetObject("notifyIcon1.Icon")));
        notifyIcon1.Visible = true;
        level2ToolStripMenuItem.DropDownItems.Add(level3ToolStripMenuItem);
        level1ToolStripMenuItem.DropDownItems.Add(level2ToolStripMenuItem);
        contextMenuStrip1.Items.Add(level1ToolStripMenuItem);
    }
}
Run Code Online (Sandbox Code Playgroud)
    这是不容易的,但你可以在编写代码DropDownOpening事件,看看那里的菜单是(其边界),当前屏幕,然后设置DropDownDirection的ToolStripMenuItem:
private void submenu_DropDownOpening(object sender, EventArgs e)
{
    ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
    if (menuItem.HasDropDownItems == false)
    {
        return; // not a drop down item
    }
    // Current bounds of the current monitor
    Rectangle Bounds = menuItem.GetCurrentParent().Bounds;
    Screen CurrentScreen = Screen.FromPoint(Bounds.Location);
    // Look how big our children are:
    int MaxWidth = 0;
    foreach (ToolStripMenuItem subitem in menuItem.DropDownItems)
    {
        MaxWidth = Math.Max(subitem.Width, MaxWidth);
    }
    MaxWidth += 10; // Add a little wiggle room
    int FarRight = Bounds.Right + MaxWidth;
    int CurrentMonitorRight = CurrentScreen.Bounds.Right;
    if (FarRight > CurrentMonitorRight)
    {
        menuItem.DropDownDirection = ToolStripDropDownDirection.Left;
    }
    else
    {
        menuItem.DropDownDirection = ToolStripDropDownDirection.Right;
    }
}
Run Code Online (Sandbox Code Playgroud)
另外,请确保您已连接DropDownOpening事件(您确实需要将其添加到每个菜单项中):
level1ToolStripMenuItem += submenu_DropDownOpening;
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1248 次  |  
        
|   最近记录:  |