2012-09-19 101 views
1

一旦Rich Text Box被右鍵單擊,我正在創建一個上下文菜單條。有2個選項,一個用來改變字體,另一個用來改變背景顏色。但是,一旦我單擊其中一個菜單選項,上下文菜單條就不會關閉並覆蓋顯示的對話框。我知道我可以讓它「全球化」並強迫它關閉,但我寧願不要。處理這個問題的最好方法是什麼?ContextMenuStrip一次點擊就不關閉

// 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 Persisting

回答

1

你不想創建ContextMenuStrip每次手動證明這一點。更好的方法是創建ContextMenuStrip一次。然後將其分配給RichTextBox,方法是將其分配給RichTextBoxContextMenuStrip屬性。這樣做時,用戶每次點擊它時都不需要手動啓動ContextMenuStrip。它會自動發生。它也會按照您點擊它期望的方式自動隱藏自己。

這樣做一次,然後刪除你的事件處理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自我更新。 Head over to here and read the top answer.一般而言,如果您使用的是Application.DoEvents(),則表示您做錯了事,應考慮更改您的方法。

您可能還會考慮做一件事,但這只是一個偏好問題......如果您使用Visual Studio,請考慮在設計器中創建ContextMenuStrip。這樣,您可以非常方便地直觀地爲每件商品添加商品,圖標和單個回調。只是我喜歡做的純粹的個人偏好。

+0

。我只會把'Application.DoEvents()',看看是否會工作,但它沒有,也這條線將不起作用: '菜單。顯示(這是新的Point(eX,eY));'用你的代碼 –

+0

對不起,我打算排除這一點。更新我的代碼。這個想法是,你不需要手動顯示上下文菜單。當您將上下文菜單分配給ContextMenuStrip屬性時,RTB將爲您處理此問題。 –

+0

好吧,你的代碼工作,但有一些小的變化; ''ContextMenuStrip menu = new ContextMenuStrip();'必須全局聲明,其餘的必須在'public MainForm()'內部完成,並且不會自動隱藏自己,'menu.Close();'必須被添加到'menu_ItemClicked_ChangeFont'函數。一旦我做到了這一點,它工作。 –

0

ToolStripItemClickedEventArgs只是聲明:

ContextMenuStrip menu = (ContextMenuStrip)(Sender) 

if (e.ClickedItem.Text == "Change Font") 
{ 
    menu.hide(); 
    /* and your code here*/... 
} 
相關問題