C #, treeView, Как изменить стандартное поведение правой кнопки мыши - PullRequest
1 голос
/ 01 марта 2010

У меня есть вопрос.

Я добавил в форму элемент управления treeview и добавил несколько узлов.

    public Form1()
    {
        InitializeComponent();

        treeView1.Nodes.Add("root node #1");
        treeView1.Nodes.Add("root node #2");
        treeView1.Nodes.Add("root node #3");
        treeView1.Nodes.Add("root node #4");
        treeView1.Nodes.Add("root node #5");
    }

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

В идеале это было бы: щелкните правой кнопкой мыши текст триода, -> появится контекстное меню, щелкните правой кнопкой мыши в любом месте за пределами текста триода -> (абсолютно) ничего не происходит .

Ответы [ 4 ]

3 голосов
/ 01 марта 2010
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
 if (e.Button == MouseButtons.Right)
 {
    // put your logic here like
    // ContextMenu1.Show();
 }
}
1 голос
/ 11 марта 2010

Алекс, попробуй это.Событие BeforeSelect обработчиков аргументов Cancel связано с тем, что правая мышь нажата.Это подавляет срабатывание измененного SelectedIndex.MouseDown отслеживает нажатие правой кнопки мыши и отображает контекстное меню.Дисплей можно безопасно перемещать в MouseUp вместо MouseDown.MouseUp очищает флаг, указывающий, что кнопка RightMouse нажата.

Вся эта информация о том, как я это сделал, доступна на MSDN.Хитрость заключается в том, чтобы на самом деле прочитать имена всех событий - да, я знаю, что их много, - затем составить список «интересных» в вашем случае, который вы назвали SelectedIndex, и щелкнуть мышью.Это сразу ограничивает имена событий, о которых вы должны подробно прочитать ... Если вы хотите, чтобы текст не выделялся при щелчке правой кнопкой мыши ... ну, это совсем другое дело, и я предостерегаю вас от этого, так как это ценный отзыв пользователя.

    bool isRBut = false;
    private void treeView1_MouseDown(object sender, MouseEventArgs e)
    {
        isRBut = e.Button == MouseButtons.Right;
        if (isRBut)
        {
            TreeViewHitTestInfo hti =treeView1.HitTest(e.Location);
            if (hti.Location == TreeViewHitTestLocations.Label)                
                contextMenuStrip1.Show(treeView1, new Point(hti.Node.Bounds.Left, hti.Node.Bounds.Bottom));                
        }
    }

    private void treeView1_MouseUp(object sender, MouseEventArgs e)
    {
        isRBut = e.Button == MouseButtons.Right;
    }

    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
    {
        e.Cancel = isRBut;
    }

Кроме того, вот вам немного человеческих языковых пустяков.Надеюсь, это поможет вам в будущем.Такие фразы, как «Нет, нет, нет», интерпретируются носителями английского языка как очень грубые.Просто сделайте все возможное, чтобы перечислить поведение, которое вы видите, и поведение, которое вы хотите.Даже если люди неправильно понимают, придерживаются только фактов и оставляют очевидные признаки разочарования.Это поможет вам получить то, что вы после.Также и на SO, если у кого-то есть привычка не принимать ответы, многие участники здесь будут иметь привычку не давать такие ответы в будущем.

0 голосов
/ 01 марта 2010

Вам нужно обработать событие NodeMouseClick и проверить, была ли нажата правая кнопка мыши:

treeView1.NodeMouseClick += (o, e) => {
    if(e.Button == MouseButtons.Right)
    {
        //show menu...
    }
};
0 голосов
/ 01 марта 2010

Переопределите событие MouseClick, и в событии проверьте, был ли щелчок правой кнопкой мыши

    private void treeView1_MouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            //Do something
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...