WPF:OnKeyDown() di non essere chiamato per lo spazio in chiave di controllo derivato da WPF TextBox

StackOverflow https://stackoverflow.com/questions/1458748

  •  12-09-2019
  •  | 
  •  

Domanda

In un'applicazione WPF, ho un controllo che ho derivato dalla casella di testo come questo:

public class SelectableTextBlock : TextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        e.Handled = false;
    }
}

OnKeyDown metodo non viene chiamato quando si entra in uno spazio nella casella di testo, né quando si preme il tasto Backspace, ma fa fuoco per altri input, tra cui i normali caratteri stampabili (ad es.'a') e tasti di modifica (ad es.).

Sto usando questo controllo con IsReadOnly impostata su true, così posso display selezionabile, non modificabile testo.Il controllo interno WPFToolkit del DataGrid, e vorrei eventi KeyDown per propagare la griglia di dati, anche se il SelectableTextBlock ha il focus, che è il motivo per cui sto usando un controllo personalizzato per marcare in modo esplicito l'evento come non gestita.

Il problema è che l'evento non è ancora di fare al mio controllo per determinate chiavi.Non posso utilizzare OnPreviewKeyDown nel DataGrid per ottenere intorno a questo, dal momento che non voglio altri comandi utilizzati nella griglia di dati di ingoiare lo spazio evento KeyDown.

Qualcuno sa come posso ottenere l'evento KeyDown per il tasto spazio per propagarsi?

Grazie.

È stato utile?

Soluzione 2

Sembra che il problema è che lo spazio (e backspace ecc) DOWN evento viene gestito già all'interno della TextBox, prima che bolle fino al mio controllo derivato. Presumo come parte del processo di composizione del testo, come pubblicato Wim.

Per risolvere questo, ho aggiunto un gestore che riceverà l'evento premuto il tasto, anche è già stato trattato, e ne imposta il membro Handled su false, per consentirgli di portare avanti ribolle normalmente. Nell'esempio che segue è solo fa questo per le chiavi di spazio, ma nel mio caso ho bisogno per fargli fare questo per tutti gli eventi chiave che ho davvero Non desidero trattati nel mio SelectedableTextBlock, come ho non so cosa gli eventi chiave genitori potrebbero essere interessati a ancora.

public class SelectableTextBlock : TextBox
{
    public SelectableTextBlock() : base()
    {
        this.AddHandler(SelectableTextBlock.KeyDownEvent, new RoutedEventHandler(HandleHandledKeyDown), true);
    }

    public void HandleHandledKeyDown(object sender, RoutedEventArgs e)
    {
        KeyEventArgs ke = e as KeyEventArgs;
        if (ke.Key == Key.Space)
        {
            ke.Handled = false;
        }
    }
    ...
}

Sono ovviamente ancora interessato se qualcuno ha una soluzione migliore ...

Grazie, E.

Altri suggerimenti

L'evento PreviewKeyDown esiste proprio per questo genere di cose.

private void spacebarHandler_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
        e.Handled = true;
}

Il gestore KeyDown non riceverà mai l'evento KeyDown per la barra spaziatrice.

Ho avuto questo problema con gli spazi e gli eventi una volta in una casella di testo.Sono gli eventi da NON attivato solo quando si aggiunge o rimuove un carattere di spazio?

Questo è quello che ho ottenuto come risposta:(http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b)

Perché alcuni Ime tratterà spazi di battitura come parte del processo di composizione del testo, ecco perché si mangia da Avalon per riportare la corretta composta di testo attraverso l'evento TextInput.

Potrei essere completamente al di fuori del campo di applicazione, ma la lettura di questo thread emmideatly mi ha fatto pensare che il problema che avevo un tempo.

Cordiali saluti, Wim

Derive voce in capitolo, RestrictKeysTextBox da TextBox.

public class RestrictKeysTextBox : TextBox
{
    ....
}

Override l'evento OnPreviewKeyDown nel RestrictKeysTextBox.

logica messo in questa esclusione in questo modo:

if (e.Key == Key.Space)
{
    e.Handled = true;
}

Associare l'istanza del RestrictKeysTextBox al DataGrid.

Che dovrebbe funzionare senza l'override del OnPreviewKeyDown nel DataGrid e eliminare i problemi associati.

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