2015-11-24 5 views
0

В простом приложении C# WinForms, если контекстное меню назначено элементу управления Treeview, а пользователь щелкает правой кнопкой мыши узел с помощью мыши, контекстное меню отображается под узел в точке курсора, но если используется контекстное меню клавиатуры или shift + F10, меню смещается и отображается в середине дерева по длине. Почему это поведение по умолчанию и как можно отображать контекстное меню под выбранным узлом?C# - Контекстное меню TreeView вне места при использовании клавиатуры

Mouse Right-Click

Keyboard Right-Click

ответ

1

Глядя на reference source реализации, это, как представляется, реализация по умолчанию для любого элемента управления (не только TreeView) контекст обработки меню при активации с помощью клавиатуры, которая работает отлично подходит для TextBox как управления , Интересно, что документация WM_CONTEXTMENU message содержит следующее заявление в Замечания раздела

Если контекстное меню создается с клавиатурой, например, если пользователь SHIFT + F10-то x- и y- координаты -1, и приложение должно отображать контекстное меню в месте текущего выбора, а не в (xPos, yPos).

, который, по-видимому, не сопровождается выполнением управления WinForms TreeView.

Чтобы получить желаемое поведение, вы должны создать подкласс и процесс WM_CONTEXTMENU сообщение самостоятельно TreeView, как этот

class MyTreeView : TreeView 
{ 
    const int WM_CONTEXTMENU = 0x007B; 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_CONTEXTMENU && (long)m.LParam == -1 && this.ContextMenu != null) 
     { 
      var selectedNode = this.SelectedNode; 
      if (selectedNode == null) return; 
      var rect = selectedNode.Bounds; 
      var pt = new Point(rect.X + rect.Width/2, rect.Y + rect.Height/2); 
      if (!this.ClientRectangle.Contains(pt)) return; 
      this.ContextMenu.Show(this, pt); 
      return; 
     } 
     base.WndProc(ref m); 
    } 
} 
+0

, который получил это работает. Спасибо. Я не знал, что у MS есть источник ссылок для .NET Framework. Будет использовать это много! – David

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