Ich habe eine .NET 2.0 WinForms-Anwendung mit einem ToolStrip auf meinem Hauptformular. Manchmal werden die ToolStrip-Symbole nicht mit dem ersten Mausklick verknüpft, daher muss ich zweimal auf das Symbol klicken. Es ist nur ein Standard-ToolStrip mit mehreren Icons und Tooltip-Texten, ich mache nichts besonderes. Ist das üblich?ToolStrip reagiert manchmal nicht auf einen Mausklick
Antwort
Wenn das Anwendungsfenster nicht den Fokus hat, müssen Sie zweimal auf die Schaltfläche ToolStrip klicken. Der erste Klick setzt den Fokus auf das Fenster, der zweite auf das Klick-Ereignis. Dies ist (leider) das Standardverhalten und es ist von Entwurf. Microsoft Word zeigt das gleiche Verhalten (obwohl der .NET ToolStrip nicht dasselbe Steuerelement ist).
Ich hatte das in anderen Entwicklungsumgebungen (VB6), und es stellte sich heraus, weil der erste Klick von der Symbolleiste absorbiert wurde, um den Fokus zu erhalten. Oder, um es anders auszudrücken, die Symbolleiste würde nicht auf einen Klick reagieren bis es den Fokus hatte. Um dies zu testen, klicken Sie auf einen leeren Teil der Symbolleiste, bevor Sie auf die Schaltfläche klicken. Wenn Sie nicht zweimal auf die Schaltfläche klicken müssen, nachdem Sie auf die Symbolleiste geklickt haben, ist das möglicherweise das Problem. Ich denke, dass sie es geschafft haben (und das war vor Jahren, also entschuldige bitte den Hack), programmatisch den Fokus auf die Toolbar im MouseOver-Event zu legen.
Danke, sowieso Es scheint, dass dies nicht mein Fall ist. Wenn ich den Fokus auf ein anderes Steuerelement (z. B. eine Schaltfläche außerhalb des ToolStrips) und dann auf eine ToolStrip-Schaltfläche setze, wird der Klick akzeptiert. – user20353
Ich hatte das gleiche Problem vor einiger Zeit, und ich fand eine Lösung in Rick Brewster's blog. Die Idee ist, 'WndProc' in einer abgeleiteten Klasse ToolStripEx zu überschreiben. Der Kern dieser Lösung sieht wie folgt aus:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == NativeConstants.WM_MOUSEACTIVATE &&
m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT)
{
m.Result = (IntPtr)NativeConstants.MA_ACTIVATE;
}
}
Das ist perfekt, besser als jede der Alternativen, die ich ausprobiert habe. – user169771
Ähnliche Lösung unter: https://stackoverflow.com/a/4967537/767664 – Pedro77
Sie können Ihre eigene Klasse erstellen, die von der Toolstrip erbt und eine benutzerdefinierte Eigenschaft ClickThrough
verwenden Sie das Verhalten bzw. auszuschalten:
Public Class ToolStripExtended : Inherits ToolStrip
Private Const WM_MOUSEACTIVATE As UInteger = &H21
Private Const MA_ACTIVATE As UInteger = 1
Private Const MA_ACTIVATEANDEAT As UInteger = 2
Private Const MA_NOACTIVATE As UInteger = 3
Private Const MA_NOACTIVATEANDEAT As UInteger = 4
Private _clickThrough As Boolean = False
Public Sub New()
MyBase.New()
End Sub
''' <summary>
''' Gets or sets whether the ToolStripEx honours item clicks when its containing form does
''' not have input focus.
''' </summary>
''' <remarks>
''' Default value is false, which is the same behaviour provided by the base ToolStrip class.
''' </remarks>
Public Property ClickThrough() As Boolean
Get
Return Me._clickThrough
End Get
Set(value As Boolean)
Me._clickThrough = value
End Set
End Property
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If _clickThrough AndAlso m.Msg = WM_MOUSEACTIVATE AndAlso m.Result = New IntPtr(MA_ACTIVATEANDEAT) Then
m.Result = New IntPtr(MA_ACTIVATE)
End If
End Sub
End Class
Es gibt einen Unterschied zwischen MS Word und den .NET ToolStrip-Schaltflächen: Wenn die Word-Anwendung nicht den Fokus hat, werden die Menüs und Symbole in Word nicht durch den Mauszeiger hervorgehoben. Sie werden nur hervorgehoben, wenn Word den Fokus hat. Auf der anderen Seite hebt der .NET ToolStrip seine Schaltflächen hervor, selbst wenn die Anwendung nicht den Fokus hat, Vortäuschungen, dass ein Mausklick die Schaltfläche sofort aktivieren würde. –