Domanda

Ho creato un AppBar. L'AppBar sempre rimane in cima, quando perde la messa a fuoco, quindi per tornare al AppBar richiede due scatti invece di uno. Credo che il primo click si attiva il modulo e quindi con il secondo click ho di ricevere gli eventi clic del mouse (come previsto). Puoi dare qualche idea, che cosa può essere sbagliato? Il mio problema è simile a questo appbar e problemi di messa a fuoco . Purtroppo l'OP in quel link non ha pubblicato la sua soluzione, triste.

ho creato il seguente AppBar questo articolo da CodeProject C # fa Shell, parte 3 .

ho guardato dentro con Spy ++, ma non hanno alcuna idea del perché questo sta accadendo. Ecco il registro Spy ++ che ho ottenuto testare questo scenario (primo scatto non funziona, secondo lo fa).

<00001> 00090CFE S WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos:25 yPos:17
<00002> 00090CFE R WM_PARENTNOTIFY
<00003> 00090CFE S WM_WINDOWPOSCHANGING lpwp:0418EAE4
<00004> 00090CFE R WM_WINDOWPOSCHANGING
<00005> 00090CFE S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
<00006> 00090CFE R WM_ACTIVATEAPP
<00007> 00090CFE S WM_NCACTIVATE fActive:True
<00008> 00090CFE R WM_NCACTIVATE
<00009> 00090CFE S WM_ACTIVATE fActive:WA_CLICKACTIVE fMinimized:False hwndPrevious:(null)
<00010> 00090CFE S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<00011> 00090CFE S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
<00012> 00090CFE R WM_IME_NOTIFY
<00013> 00090CFE R WM_IME_SETCONTEXT
<00014> 00090CFE S WM_SETFOCUS hwndLoseFocus:(null)
<00015> 00090CFE R WM_SETFOCUS
<00016> 00090CFE R WM_ACTIVATE

Now happens the second click (which works)
<00017> 00090CFE S WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos:25 yPos:17
<00018> 00090CFE R WM_PARENTNOTIFY
<00019> 00090CFE S WM_WINDOWPOSCHANGING lpwp:0418E40C
<00020> 00090CFE R WM_WINDOWPOSCHANGING

Guardando i registri della Spy ++, credo che il problema sia con l'attivazione, credo che riceve solo WM_LBUTTONDOWN evento se la finestra è attiva. Ma come mai le altre finestre non sono attivati, ma si lavora ancora con un solo clic (vale a dire che non c'è bisogno di clic su di esso per primo).

Modifica Credo che il problema è con il ToolStrip . Ho un ToolStrip nel mio AppBar. Ora, come ho verificato questo? Bene sullo stesso modulo ho creato un pulsante e ha mostrato una finestra di messaggio nella sua evento click e sta funzionando benissimo. Ora come porre rimedio a questo?

È stato utile?

Soluzione

Alrighty, ho capito finalmente e (nell'interesse dei posteri) questo è ciò che sta accadendo. Il problema non è con il Modulo , piuttosto con il ToolStrip (può essere riprodotto in Word, credo). Questa funzionalità è di progettazione e non un bug. Nel WM_MOUSEACTIVATE messaggio, dentro WndProc del ToolStrip , restituisce il MA_ACTIVATEANDEAT che attiva la finestra, cioè fornendo lo stato attivo, ma elimina il messaggio del mouse è per questo che è necessario fare clic due volte perché la messaggio di primo mouse viene scartato.

Ora la soluzione? Ignorare il WndProc di ToolStrip nella classe derivata e, invece di impostare la proprietà Message.Result a MA_ACTIVATEANDEAT , impostarlo su MA_ACTIVATE . Ecco un tutorial su come farlo. Come abilitare "click through" per .NET 2.0 ToolStrip e MenuStrip

La speranza che aiuta:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top