2010-02-06 4 views
6

Ho un WPF Textbox, che voglio controllare che il valore del testo sia corretto prima che gli permetta di perdere tastiera/focus.Interruzione di una casella di testo WPF da perdita di messa a fuoco

Ho provato a impostare e.Handled negli eventi InputBox_LostFocus & InputBox_LostKeyboardFocus, ma non sembra ottenere ciò che voglio.

Qualche suggerimento su come posso bloccare lo stato attivo su un Textbox?

+5

Focus-locking rende un'esperienza utente davvero odiosa. Prima di passare un sacco di sforzi cercando di capire come farlo, avrei ridisegnato l'interfaccia utente per funzionare in modo diverso - ad esempio, disabilita ogni altro controllo nella finestra finché il 'TextBox' non ha un contenuto valido. –

+0

@Robert: a meno che non si stia progettando un'applicazione per registratore di cassa, è praticamente obbligatorio. In un'app di registro, digiti un numero o un testo, ALLORA decidi cosa è effettivamente quell'input, premendo un pulsante. (ad esempio Numero, SKU, numero, quantità, numero, chiave di pagamento, ecc.) – HiredMind

risposta

4

È possibile chiamare Mouse.Capture su un UIElement. Questo ti darà quindi ogni evento del mouse che agisce sull'elemento o meno. ma è difficile da usare. Puoi catturare il mouse sulla tua casella di testo e registrarti per gli eventi di cattura persi, quando perdi l'acquisizione puoi ricatturarla. devi stare attento a comportamenti strani. Generalmente la sua cattiva pratica (credo) per non permettere a un utente di spostarsi da un campo. cosa c'è di meglio è quello di permettere loro di fare ciò che vogliono, ma disabilitare il pulsante che spingono dopo aver inserito i dati fino a quando tutti i campi sono validi (o qualcosa di simile)

Ecco alcuni link

other SO question

msdn sample code

casella combinata utilizza la cattura del mouse per dire se l'utente ha cliccato altrove in app per chiudere la casella combinata se aperta, se si fa clic su un altro controllo (o al di fuori della finestra)

Non so se questa tecnica ti impedirà di eliminare l'elemento. ci sono due tipi di focus in una app wpf. Hai messa a fuoco logica e messa a fuoco della tastiera. Più elementi possono avere il focus logico in una volta (ognuno all'interno di un ambito di messa a fuoco). per esempio, una casella di testo può avere un focus logico mentre si fa clic su un menu (che ha anche il focus logico). La messa a fuoco della tastiera può essere solo in un punto alla volta. Stai per fare un sacco di lavoro per te stesso. Prenderò seriamente in considerazione se stai facendo la tua interazione nel modo giusto. Potresti passare giorni a correggere questa interazione. Se si interrompe la perdita di concentrazione della casella di testo, cosa accade se l'utente fa clic sul pulsante Chiudi?

heres il msdn article on focus

+0

Grazie Aran, questo è un buon consiglio. Forse guarderò alla funzionalità per essere diverso. –

7

Il modo migliore per farlo è quello di gestire l'evento PreviewLostKeyboardFocus che si infiamma durante la gara tunneling verso il basso per la vostra casella di testo. Imposta handle su true e nient'altro riceverà la notifica (significa che la messa a fuoco non verrà trasferita dalla tua casella di testo). Spero che questo ti aiuti.

+0

Ha funzionato come un incantesimo per me. Cosi 'semplice ! –