1

У меня есть приложение, которое в основном работает через ContextMenuStrip от NotifyIcon.
Существует несколько уровней инструментов ToolStripMenuItems, и пользователь может пройти через них.
Проблема в том, что когда пользователь имеет два экрана, MenuItems переходят на второй экран, когда пространство не доступно. как так:Предотвращение перетаскивания ToolStripMenuItems во второй экран

enter image description here

Как я могу заставить их остаться на том же экране? Я попытался выполнить поиск в Интернете, но не нашел подходящего ответа.

Вот пример кусок кода я использую, чтобы проверить эту 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); 
    } 
} 
+0

Попробуйте добавить его с помощью конструктора форм и посмотреть, какой код сгенерирован. Может быть, вы просто пропустите одно задание. Поведение выглядит странно, например, если «падение уровня 3» не может определить родителя (придерживаться того же экрана, что и его родительский). – Sinatr

+0

Это конструктор форм. Я просто немного переработал его для удобства чтения. (Преобразование полей в локальные и удаление ненужных строк) – atlanteh

+0

В Winforms есть определенный код, который должен помешать этому. Это выглядит немного странно, проверьте, все ли еще происходит * второе * время, когда вы открываете контекстное меню. Если это не так, я могу опубликовать обходной путь. –

ответ

3

Это не легко, но вы можете написать код в случае 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; 
     } 
    } 

Кроме того, убедитесь, что у вас есть событие DropDownOpening подключили (Вам действительно нужно было бы добавить это к каждому пункту меню):

level1ToolStripMenuItem += submenu_DropDownOpening; 
+0

Thx man! Я давно забыл об этом приложении, но сейчас я попробую :) – atlanteh

 Смежные вопросы

  • Нет связанных вопросов^_^