Установка ToolStripMenuItem.Visible в true не работает - PullRequest
2 голосов
/ 19 марта 2012

У меня есть элемент управления TreeView, для которого каждый узел в нем я хочу поделиться ContextMenuStrip, который имеет два ToolStripMenuItems, то есть:

this.BuildTree = new MyApp.MainForm.TreeView();
this.ItemMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.DeleteMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ShowLogMenuItem = new System.Windows.Forms.ToolStripMenuItem();
...
this.ItemMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.DeleteMenuItem,
this.ShowLogMenuItem});

Поэтому я показываю и скрываю их для элементов в соответствии с определенными критериями при щелчке правой кнопкой мыши в событии MouseUp. Когда оба скрыты, я скрываю сам ContextMenuStrip. Проблема в том, что когда я скрываю ContextMenuStrip, в следующий раз, когда я хочу показать один из пунктов меню, мне нужно дважды щелкнуть по узлу. Странная вещь заключается в первом щелчке, чтобы повторно показать один или оба элемента, у меня есть следующий код:

ItemMenuStrip.Visible = true;
ShowLogMenuItem.Visible = true;

Две строки выше, похоже, ничего не делают, т.е. обе остаются ложными в представлении отладчика после перехода по каждой строке.

Я не думаю, что у меня установлены какие-либо события для этих значений, по крайней мере, у меня нет событий.

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Я предлагаю вам установить:

this.BuildTree.ContextMenuStrip = this.ItemMenuStrip;

, чтобы меню автоматически открывалось по дереву правой кнопкой мыши.

Затем подпишитесь на событие ItemMenuStrip.Opening, чтобы изменить видимость элементов и самого контекстного меню:

void ItemMenuStrip_Opening(object sender, CancelEventArgs e)
{
    if (something)
    {
        e.Cancel = true; // don't show the menu
    }
    else
    {
        // show/hide the items...
    }
}

Если вам нужно узнать текущую позицию точки, по которой щелкнули (например, чтобы проверить, нажат ли узел дерева), вы можете использовать свойство Control.MousePosition. Обратите внимание, что MousePosition - это точка в экранных координатах, поэтому вам нужно вызвать treeView1.PointToClient(position), чтобы получить координаты дерева, например, :

private void ItemMenuStrip_Opening(object sender, CancelEventArgs e)
{
    var pointClicked = this.BuildTree.PointToClient(Control.MousePosition);
    var nodeClicked = this.BuildTree.GetNodeAt(pointClicked);
    if (nodeClicked == null) 
    {
        // no tree-node is clicked --> don't show the context menu
        e.Cancel = true;
    }
    else
    {
        // nodeClicked variable is the clicked node;
        // show/hide the context menu items accordingly
    }
}
0 голосов
/ 20 марта 2012

Итак, я понял, что происходит не так. Я установил Visible на this.ItemMenuStrip, а не this.BuildTree.ContextMenuStrip.

Мне это кажется довольно странным, так как я бы подумал, что BuildTree.ContextMenuStrip - это просто прямая ссылка на ItemMenuStrip, но, очевидно, нет.

...