Измените порядок элементов toolStrip в том же toolStrip, не удерживая нажатой клавишу ALT в C # VS 2008

У меня есть toolStrip1, помещенный в форму (System.Windows.Forms) в C #, и к нему добавлены пять кнопок toolStrip. Теперь мне интересно, как позволить пользователю переупорядочить эти кнопки, перетащив их на другие позиции в toolStrip1. Я установил для toolStrip1.AllowItemReorder значение true, а для AllowDrop - значение false, как предлагает Microsoft в статье.

Теперь должна быть включена автоматическая обработка переупорядочения элементов в toolStrip1. Но это не работает - только если я удерживаю нажатой клавишу ALT, toolStrip1 реагирует на попытки переупорядочения со стороны пользователя. Действительно ли я должен самостоятельно обрабатывать DragEvent, DragEnter, DragLeave, чтобы не удерживать клавишу Alt во время переупорядочивания элементов?

Если это так, дайте мне пример того, как эти события будут выглядеть в toolStrip с toolStripButtons, если я хочу перетащить один элемент в другую позицию внутри toolStrip1, не удерживая никаких клавиш ALT (как это делает Internet Explorer Favorites). Я не разбираюсь в этом вопросе.


person feedwall    schedule 27.09.2013    source источник


Ответы (1)


Что ж, возможно, вам придется использовать это решение, которое немного взломано. Вся идея в том, что вам нужно нажать и удерживать клавишу Alt по коду. Я пробовал использовать событие MouseDown (даже в PreFilterMessage handler), но это не удалось. Единственное событие, подходящее для удержания клавиши Alt при срабатывании, - это MouseEnter. Вы должны зарегистрировать обработчик событий MouseEnter для всех ToolStripItems, когда указатель мыши покидает один из этих элементов, вы должны отпустить клавишу Alt в обработчике событий MouseLeave. После отпускания клавиши Alt мы должны отправить клавишу ESC, чтобы сделать форму активной (в противном случае все эффекты наведения будут игнорироваться, даже на кнопках Control, включая Minimize, Maximize, Close). Вот код, который работает:

public partial class Form1 : Form {
  [DllImport("user32.dll", SetLastError = true)]
  static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
  public Form1(){
     InitializeComponent();
     //Register event handlers for all the toolstripitems initially
     foreach (ToolStripItem item in toolStrip1.Items){
        item.MouseEnter += itemsMouseEnter;
        item.MouseLeave += itemsMouseLeave;
     }
     //We have to do this if we add/remove some toolstripitem at runtime
     //Otherwise we don't need the following code
     toolStrip1.ItemAdded += (s,e) => {
        item.MouseEnter += itemsMouseEnter;
        item.MouseLeave += itemsMouseLeave;
     };
     toolStrip1.ItemRemoved += (s,e) => {
        item.MouseEnter -= itemsMouseEnter;
        item.MouseLeave -= itemsMouseLeave;
     };
  }
  bool pressedAlt;
  private void itemsMouseEnter(object sender, EventArgs e){
        if (!pressedAlt) {
            //Hold the Alt key
            keybd_event(0x12, 0, 0, 0);//VK_ALT = 0x12
            pressedAlt = true;
        }
  }
  private void itemsMouseLeave(object sender, EventArgs e){
        if (pressedAlt){
            //Release the Alt key
            keybd_event(0x12, 0, 2, 0);//flags = 2  -> Release the key
            pressedAlt = false;
            SendKeys.Send("ESC");//Do this to make the GUI active again
        }            
  }
}
person King King    schedule 27.09.2013