Установка ToolStripMenuItem.Visible на true не работает

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

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;

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

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

Что я делаю неправильно?


person user176168    schedule 19.03.2012    source источник
comment
Видимость также является частью родительского элемента управления. Поскольку вы находитесь в процессе «открытия», у вас нет пользовательского интерфейса, поэтому он не отображается. Путем проб и ошибок я обнаружил, что, хотя get / set не являются прямыми назначениями, он запоминает, что вы установили перед рендерингом. Затем .Visible используется соответствующим образом при отображении элемента управления.   -  person Dominic Zukiewicz    schedule 07.02.2013


Ответы (2)


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

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...
    }
}

Если вам нужно знать текущую позицию точки, в которой был выполнен щелчок (например, чтобы проверить, был ли нажат узел дерева), вы можете использовать _ 4_. Обратите внимание, что 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
    }
}
person digEmAll    schedule 19.03.2012
comment
К сожалению, это тоже не сработало, и я попробовал это с помощью Доступно. Одна вещь, которую я заметил, заключается в том, что если я просто использую Available или Visible и не скрываю фактический ItemMenuStrip, тогда, когда я щелкаю правой кнопкой мыши узел с пустым ItemMenuStrip, я вижу пустой ItemMenuStrip, но следующий щелчок (проблемный) я не Я ничего не вижу, как будто розыгрыша не происходит. - person user176168; 20.03.2012
comment
Это сработало, но остерегайтесь эффекта наблюдателя. У меня была установлена ​​точка останова, и Visible всегда казался ложным в моих инструментах отладки, но это было потому, что, когда точка останова попадала в Visual Studio, все контекстное меню было скрыто, что заставляло видимое быть ложным. - person kampsj; 05.09.2013

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

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

person user176168    schedule 20.03.2012
comment
Должна быть такая же ссылка. Проверьте, правильно ли вы передаете ItemMenuStrip дереву. - person digEmAll; 20.03.2012