2

2 つの ToolStripMenuItems を持つ ContextMenuStrip を共有する各ノードの TreeView コントロールがあります。

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 を非表示にすると、次にノードを 2 回クリックしなければならないメニュー項目の 1 つを表示したいように見えることです。奇妙なことに、最初のクリックでアイテムの 1 つまたは両方が再表示されます。次のコードがあります。

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

上記の 2 行は何もしていないように見えます。つまり、各行をステップオーバーした後、デバッガー ビューではどちらも false のままです。

これらの値が設定されているイベントはないと思いますが、少なくともイベントは関連付けられていません。

私は何を間違っていますか?

4

2 に答える 2

3

設定することをお勧めします:

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
    }
}
于 2012-03-19T17:56:45.837 に答える
0

だから私はthis.BuildTree.ContextMenuStripではなくthis.ItemMenuStripにVisibleを設定していたので、何がうまくいかなかったのかを理解しました。

BuildTree.ContextMenuStrip は ItemMenuStrip への直接参照にすぎないと思っていたので、これはかなり奇妙に思えますが、明らかにそうではありません。

于 2012-03-20T11:46:04.867 に答える