Здесь на ум приходит пара вариантов. Оба вполне могут быть излишними, но они все же решают проблему.
Обработайте событие MouseDown
и используйте метод HitTest
, чтобы определить, на каком узле щелкнул пользователь. Если они щелкнули действительный узел, вручную установите фокус на этот узел с помощью свойства SelectedNode
.
private void myTreeView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
myTreeView.SelectedNode = myTreeView.HitTest(e.Location).Node;
}
}
Решение в стиле базуки заключается в переопределении метода WndProc
и прослушивании сообщений WM_RBUTTONDOWN
. Я сделал это в своей собственной расширенной версии элемента управления TreeView
, потому что он позволяет мне исправить некоторые мелочи, которые обычные, не одержимые люди, вероятно, не заметят. Я отвечаю на мучительную деталь в своем ответе здесь .
По сути, вы делаете то же самое, что и приведенный выше код, но на более низком уровне, который не дает нативному элементу управления тянуть некоторые махинации с фокусом. Я не помню, действительно ли они применимы здесь (отсюда и потенциальный перебор), но мне лень запускать Visual Studio, чтобы убедиться в этом.
public class FixedTreeView : System.Windows.Forms.TreeView
{
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_RBUTTONDOWN = 0x204;
if (m.Msg == WM_RBUTTONDOWN)
{
Point mousePos = this.PointToClient(Control.MousePosition);
this.SelectedNode = this.GetNodeAt(mousePos);
}
base.WndProc(ref m);
}
}
Первый метод должен работать просто отлично для вас. Попробуйте, прежде чем разбить оружие побольше.