2017-01-20 53 views
2

我正在尋找一種方法來啓用/禁用按鈕使用他們的ContextMenu。但我的問題是,當我點擊啓用MenuItem禁用按鈕ContextMenu不會再顯示。在禁用控件上的ContextMenu,如按鈕

有沒有辦法在禁用的控件上保留ContextMenu或其他行爲?

ContextMenu cm = new ContextMenu(); 
cm.MenuItems.Add("Enable", new EventHandler(enableButton)); 

this.button1.ContextMenu = cm; 



private void enableButton(object sender, EventArgs e) 
{ 
    MenuItem menuItem = sender as MenuItem; 
    if (menuItem != null) 
    { 
     ContextMenu menu = menuItem.GetContextMenu(); 
     Control sourceControl = menu.SourceControl; 
     sourceControl.Enabled = !sourceControl.Enabled; 
    } 
} 
+2

使自己的禁用功能,設置按鈕變灰,攔截它們的事件,這樣按鈕將顯示爲禁用狀態,但能夠接收ContextMenu事件。這種行爲是「By-Design」 –

+0

即使有可能,這也是一個糟糕的設計,因爲沒有人會嘗試右鍵單擊禁用控件。唯一可能有點合理的情況是UI設計師。 – Phil1970

回答

1

有一種解決方法來檢測鼠標右鍵單擊窗體上的事件並顯示上下文菜單。並使用this.GetChildAtPoint(e.Location)您可以找到您右鍵單擊的控件。

private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right 
      && this.GetChildAtPoint(e.Location)?.Name == "enableButton") 
    { 
     ContextMenu.Show(); 
    } 
} 
+0

但是,這是如果你點擊一個表單,它沒有指定你點擊的控件?所以,如果有多個ContextMenu的這不會工作。 –

+1

可以使用'GetChildAtPoint'找到控件。但我同意這不是一個乾淨的解決方案 – esiprogrammer

2

MSDN

與啓用屬性,可以啓用或禁用運行控制 時間。例如,您可以禁用不適用於應用程序當前狀態的控件。你也可以禁止一個控制到 限制它的使用。例如,可以禁用按鈕以防止 用戶單擊它。如果控件被禁用,則不能選擇 。

當容器控件有其enabled屬性設置爲false,所有 其所含的控件被禁用,以及。例如,如果用戶點擊包含在禁用的GroupBox 控件中的任何控件,則不會引發任何事件。

所以,禁用控件不能引發任何事件。

你可以使你自己的禁用方法,使按鈕gayed和禁用點擊事件,並反向啓用方法。

基於@esiprogrammer sugestion你可以做這樣的事情:

private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     Point pt = e.Location; 

     Control ctrl = this.GetChildAtPoint(pt); 

     if (ctrl != null) 
     { 
      ContextMenu menu = ctrl.ContextMenu;    

      menu.Show(ctrl, new Point(10,10)); 
     }      
    } 
} 
2

使自己的禁用功能,設置按鈕變灰,攔截他們的活動,這樣的按鈕就會出現禁用,但是啓用接收ContextMenu事件。這種行爲是「按設計」。

你可以很容易地找出禁用的btn.Font。對於事件的一個辦法是取消他們在禁用和掛鉤起來的啓用,這裏是得到一個控件的事件爲例...

dynamic controltype = btn; 
var events = Type.ReflectionOnlyGetType(controltype.AssemblyQualifiedName, false, true).GetEvents(); 
foreach (var item in events) 
{ 
    //EventHandler<T> use a generic Event Handler to Subscribe and Unsubscribe 
} 
+0

嗨,我試着做這個動態控制類型=新的按鈕();並在下一行得到一個錯誤:其他信息:'System.Windows.Forms.Button'不包含定義爲'AssemblyQualifiedName' –

相關問題