2010-07-16 3 views
9

Sto passando diversi TextBox per RichTextBox per ottenere alcune delle fantastiche funzionalità.RichTextBox equivalente di TextBox.AcceptsReturn

I miei TextBox sono stati configurati su AcceptReturn in modo che il tasto Invio crei una nuova riga anziché lasciare il controllo. RichTextBox non sembra avere questa funzionalità.

C'è un modo semplice per farlo o devo acquisire tutti i tasti e gestirli singolarmente?

risposta

16

Nota: questo problema si verifica solo quando si imposta la proprietà "AcceptButton" del modulo.

Impostare RichTextBox.AcceptsTab su true. Per qualche motivo questo funziona sia per le schede che per la chiave di invio. Se si desidera utilizzare solo le chiavi di inserimento, sarà necessario scrivere un codice personalizzato.

+0

Grazie. Si scopre che ho avuto quel set. Ho dimenticato che sto gestendo le pressioni dei tasti a livello di modulo per spostarmi tra i controlli di invio. Dovrò agganciare tutti i tasti e controllare che entri ogni volta per sovrascrivere i miei comportamenti. Grazie. – captncraig

1

La soluzione è quella di ignorare IsInputKey:

protected override bool IsInputKey(Keys keyData) 
{ 
    if (
     (keyData & ~Keys.Modifiers) == Keys.Tab && 
     (keyData & (Keys.Control | Keys.Alt)) == 0 
    ) 
     return false; 

    return base.IsInputKey(keyData); 
} 

Dopo aver impostato AcceptsTab al vero, ci si assicura che i processi RichTextBox sia la scheda e la chiave di ritorno. Con l'implementazione IsInputKey riportata sopra, ci assicuriamo che i tasti Tab e Maiusc + Tab non raggiungano mai lo RichTextBox in modo che vengano utilizzati per la navigazione.

L'override precedente deve essere incollato in una classe derivata da RichTextBox.

1

Poiché Carter ha sottolineato che ciò si applica solo se è impostato AcceptButton e l'altra soluzione suggerisce di derivare la classe RichTextBox, ho trovato un'altra soluzione semplice. Basta annullare AcceptButton per il tempo in cui/un RichTextBox ha il focus. Ecco un esempio di codice:

private void RichText_Enter(object sender, EventArgs e) 
{ 
    AcceptButton = null; 
} 

private void RichText_Leave(object sender, EventArgs e) 
{ 
    AcceptButton = OKActionButton; 
} 

Questo presuppone che solo un singolo AcceptButton e che è improbabile che cambi. Altrimenti dovresti copiare qualche logica di ricerca AcceptButton qui o semplicemente eseguire il backup del valore AcceptButton precedente prima di impostarlo su null.

Questa soluzione ha anche l'effetto collaterale di rimuovere il bordo predefinito dal pulsante di accettazione effettivo, indicando all'utente che premendo il tasto Invio ora non verrà attivato quel pulsante.

0

Basta cambiare l'opzione Accetta in Proprietà Richtextbox diventa "true" funzionerà come una magia