1

チェックするとドロップダウンメニューが表示され、チェックを外すとメニューが消えるボタンを実装しようとしています。私の問題は、チェックボックスまたはそのメニューがフォーカスを失ったときにチェックボックスをオフにできないことです。

チェックボックスの外観モードはボタンです。

ここに画像の説明を入力

私のコード:

private void cbSettings_CheckedChanged(object sender, EventArgs e)
{
    if (cbSettings.Checked) {cmsSettings.Show(cbSettings, 0, cbSettings.Height);}
    else {cmsSettings.Hide();}
}

contextMenuStrip の VisibleChanged / Closed イベントで checkBox のチェックを外そうとしましたが、これによりメニューが非表示になりません (または非表示にしてすぐに表示されます)。

4

2 に答える 2

1

もちろん、以下の例には、CheckBox の BackGroundImage を交換して CheckState を示すために必要なコードは含まれていません。「ワイヤーアップ」するイベントは明らかなはずです。これが役に立てば幸いです。

// tested in VS 2010 Pro, .NET 4.0 FrameWork Client Profile
// uses:
// CheckBox named 'checkBox1
// ContextMenuStrip named 'contextMenuStrip1
// TextBox named 'cMenuSelectionInfo for run-time checking of results

    // used to position the ContextMenuStrip    
    private Point cPoint;

    // context click ? dubious assumption that 'right' = context click
    private bool cmOpenedRight;

    // the clicked ToolStripMenuItem
    private ToolStripMenuItem tsMIClicked;

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

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        // positioning the CheckBox like this
        // is something in a 'real-world' example
        // you'd want to do in the Form.Load event !
        // unless, of course, you'd made the CheckBox movable
        if(checkBox1.Checked)
        {
            contextMenuStrip1.Show();
            cPoint = PointToScreen(new Point(checkBox1.Left, checkBox1.Top + checkBox1.Height));
            contextMenuStrip1.Location = cPoint;
        }
        else
        {
            contextMenuStrip1.Hide();
        }
    }

    private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        // assume you do not have to check for null here ?
        tsMIClicked = e.ClickedItem as ToolStripMenuItem;

        tbCbMenuSelectionInfo.Text = tsMIClicked + " : " + ! (tsMIClicked.Checked);
    }

    private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
    {
        e.Cancel = checkBox1.Checked;
    }

    private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
    {
        if (cmOpenedRight)
        {
            tbCbMenuSelectionInfo.Text += " : closed because : " + e.CloseReason.ToString();
        }
    }
于 2011-07-27T16:32:30.967 に答える
1

コンテキストメニューのクローズドイベントのチェックボックスをオフにするアプローチは良い方法だと思います。必要なのは、次のような「イベントキャンセルロジック」(c)です。

private void OnContextClosing(object sender, EventArgs e)
{
    _cancel = true;
    cbSettings.Checked = false;
    _cancel = false;
}

private void cbSettings_CheckedChanged(object sender, EventArgs e)
{
    if(_cancel)
       return;

    if (cbSettings.Checked) {cmsSettings.Show(cbSettings, 0, cbSettings.Height);}
    else {cmsSettings.Hide();}
}

これにより、CheckChanged イベントがチェックボックスを再チェックしなくなります。

于 2011-07-24T21:08:21.720 に答える