1

リッチテキストボックスを右クリックすると、コンテキストメニューストリップを作成しています。フォントを変更するオプションと背景色を変更するオプションの2つのオプションがあります。ただし、メニューオプションの1つをクリックすると、コンテキストメニューストリップが閉じず、表示されているダイアログがオーバーレイされます。私はそれを「グローバル」にして強制的に閉じることができることを知っていますが、むしろそうはしません。これを処理するための最良の方法は何ですか?

// If the console is right clicked then show font options
private void rtb_console_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {
        ContextMenuStrip menu = new ContextMenuStrip();
        menu.Items.Add("Change Font");
        menu.Items.Add("Change Background Color");
        menu.Show(this, new Point(e.X, e.Y));
        menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_ItemClicked_ChangeFont);
    }
}  

// Determine whether to change the font or the font background color
void menu_ItemClicked_ChangeFont(object sender, ToolStripItemClickedEventArgs e)
{
    Application.DoEvents();  // Read that this might help, but it doesn't
    if (e.ClickedItem.Text == "Change Font")
    {
        FontDialog font = new FontDialog();

        font.ShowColor = true;
        font.Font = rtb_console.Font;
        font.Color = rtb_console.ForeColor;

        if (font.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            rtb_console.Font = font.Font;
            rtb_console.ForeColor = font.Color;
        }
    }
    else if (e.ClickedItem.Text == "Change Background Color")
    {
        ColorDialog color = new ColorDialog();
        color.Color = rtb_console.BackColor;

        if (color.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            rtb_console.BackColor = color.Color;
        }
    }
}  

だからこれが起こることです:
ContextMenuStrip永続化

4

2 に答える 2

2

ContextMenuStripを作成して、毎回手動で表示する必要はありません。ContextMenuStripこれを行うためのより良い方法は、 onceを作成することです。次に、のプロパティにRichTextBox割り当てることにより、に割り当てます。これにより、ユーザーがクリックするたびに手動で起動する必要がなくなります。それは自動的に発生します。また、クリックしたときに期待する方法で自動的に非表示になります。ContextMenuStripRichTextBoxContextMenuStrip

これを1回実行してから、MouseUpイベントのイベントハンドラーを削除します。

ContextMenuStrip menu = new ContextMenuStrip(); 
menu.Items.Add("Change Font"); 
menu.Items.Add("Change Background Color"); 
menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_ItemClicked_ChangeFont);
rtb_console.ContextStripMenu = menu;

Application.DoEvents();また、 UIを強制的に更新しようと しないでください。ここに行き、一番上の答えを読んでください。 一般に、を使用しているApplication.DoEvents()場合は、何か間違ったことをしているので、アプローチを変更することを検討する必要があります。

検討することも1つありますが、それは実際には好みの問題です... Visual Studioを使用している場合ContextMenuStripは、デザイナーで作成することを検討してください。これにより、アイテム、アイコン、および各アイテムの個々のコールバックを非常に簡単かつ視覚的に追加できます。純粋な個人的な好みから私がやりたいことです。

于 2012-09-19T14:07:06.937 に答える