0

Form1にこの2つのイベントがあります。

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {
            //clear the menu and add custom items
            contextMenuStrip1.Items.Clear();
            contextMenuStrip1.Items.Add(string.Format("Edit - {0}", listBox1.SelectedItem.ToString()));
        }

        private void listBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                int index = listBox1.IndexFromPoint(e.Location);
                if (index == -1) return;
                contextMenuStrip1.Show(listBox1,listBox1.PointToClient(System.Windows.Forms.Cursor.Position));                
            }
        }

デザイナには、ContextMenuStripとlistBoxコントロールがあります。

私がそれをする必要があるのは、listBox領域のどこかでマウスの右ボタンをクリックしても何もしないということです。しかし、listBoxで選択した項目だけをクリックすると、contextMenuStripが表示されます。listBoxで選択した項目の上/上にマウスを置いた場合のみ。

プログラムがすでに実行されている場合、最初の項目が選択されているので、プログラムを実行したら、選択した項目の上にマウスを移動して右クリックボタンを押すと機能する必要があります。選択したアイテムを使用していない場合は機能しません。つまり、マウスカーソルが選択したアイテムの上にある場合にのみ、右クリックが機能し、コンテキストメニューストリップが表示されます。

選択したアイテムの上にマウスを置いても、マウスの右ボタンをクリックすると機能します。

4

1 に答える 1

1

ListBox.IndexFromPoint()は、受け入れる内容がかなり自由です。リストの最後のアイテムを超える場所は、最後のアイテムのインデックスを返します。次のように、返されたアイテムの位置をマウスの位置と照合することで、これを修正できます。

    private void listBox1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Right) {
            var idx = listBox1.IndexFromPoint(e.Location);
            if (idx >= 0 && listBox1.GetItemRectangle(idx).Contains(e.Location)) {
                listBox1.SelectedIndex = idx;
                contextMenuStrip1.Show(listBox1, e.Location);
            }
        }
    }

ユーザーに選択したアイテムのみをクリックするように強制するというあなたの要求には従わなかったことに注意してください。そのようなユーザーアクションを破棄するのはかなり不合理です。クリックしたアイテムを選択するだけの方がはるかに直感的です。これを行いたくない場合は、GetItemRectangle()呼び出しを変更して、idxの代わりにlistBox1.SelectedIndexを使用します。まだ選択したアイテムがない場合でも、問題が発生しないように注意してください。

于 2013-02-17T13:32:00.127 に答える