2017-01-20 2 views
2

Ich bin auf der Suche nach einer Möglichkeit zum Aktivieren/Deaktivieren von Schaltflächen mit ihrer ContextMenu. Aber mein Problem ist, wenn ich auf das Enable MenuItem klicke, um die Schaltfläche zu deaktivieren, wird ContextMenu nicht mehr angezeigt.ContextMenu auf deaktivierten Steuerelementen wie Schaltflächen

Gibt es eine Möglichkeit, das ContextMenu oder ein anderes Verhalten auf einem deaktivierten Control zu halten?

+2

Machen Sie Ihre eigene Sperr Funktionalität, stellen Sie die Tasten, um abgeblendet, Abfangen ihrer Ereignisse, auf diese Weise wird die Schaltfläche deaktiviert angezeigt, aber aktiviert das ContextMenu-Ereignis zu empfangen. Dieses Verhalten ist "By-Design" –

+0

Selbst wenn es möglich wäre, wäre es ein schlechtes Design, da man niemals versuchen würde, mit der rechten Maustaste auf ein Deaktivierungssteuerelement zu klicken. Der einzige Fall, in dem es etwas Sinn machen könnte, wäre ein UI-Designer. – Phil1970

Antwort

1

Es gibt eine Problemumgehung zu erkennen Rechtsklick auf mouse up Ereignis des Formulars und zeigen Kontextmenü. und mit this.GetChildAtPoint(e.Location) können Sie herausfinden, auf welches Steuerelement Sie rechts geklickt haben.

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

Aber das ist, wenn Sie auf ein Formular klicken, gibt es nicht das Steuerelement an, auf das Sie geklickt haben? Wenn es mehrere ContextMenu gibt, wird dies nicht funktionieren. –

+1

ist es möglich, das Steuerelement mit 'GetChildAtPoint' zu finden.aber ich stimme zu, es ist keine saubere Lösung – esiprogrammer

2

Von MSDN

Mit der Enabled-Eigenschaft können Sie Steuerelemente zur Lauf zeit aktivieren oder deaktivieren. Beispielsweise können Sie Steuerelemente deaktivieren, die nicht auf den aktuellen Zustand der Anwendung gelten. Sie können ein Steuerelement auch auf deaktivieren, um dessen Verwendung einzuschränken. Zum Beispiel kann eine Schaltfläche deaktiviert werden, um zu verhindern, dass der Benutzer darauf klickt. Wenn ein Steuerelement deaktiviert ist, kann es nicht ausgewählt werden.

und

Wenn ein Behälter Steuerung auf falsch seine Eigenschaft enabled gesetzt ist, alle seine enthaltenen Steuerelemente sind deaktiviert, sowie. Wenn beispielsweise der Benutzer auf eines der Steuerelemente in einem deaktivierten GroupBox-Steuerelement klickt, werden keine Ereignisse ausgelöst.

Die deaktivierte Steuerung kann also keine Ereignisse auslösen.

Sie können Ihre eigene Deaktivierungsmethode machen, die die Schaltfläche gayed aktiviert und Klickereignisse deaktiviert und die Methode reverse aktiviert.

Basierend auf @esiprogrammer sugestion Sie etwas tun können:

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

Machen Sie Ihre eigene Sperr Funktionalität, stellen Sie die Tasten, um abgeblendet, Intercept ihre Ereignisse, auf diese Weise die Schaltfläche erscheint deaktiviert wird aber aktiviert sein, um das ContextMenu-Ereignis zu empfangen. Dieses Verhalten ist "By-Design".

Sie können leicht herausfinden, dass btn.Font deaktiviert ist. Für die Ereignisse ein Weg, um sie auf Disable abzumelden ist, und Haken sie bis auf aktivieren, hier ist ein Beispiel für eine Steuerung, Ereignisse ...

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

Hallo, ich habe versucht, diese 'dynamische controltype = new Button();' und bekam einen Fehler in der nächsten Zeile: Zusätzliche Informationen: 'System.Windows.Forms.Button' enthält keine Definition für 'AssemblyQualifiedName' –