2009-06-15 8 views
7

Ho usato CommandManager.RegisterClassInputBinding per aggiungere il binding all'intero tipo. Ora voglio rimuoverlo.Come rimuovere il collegamento di input aggiunto tramite CommandManager.RegisterClassInputBinding?

Questo è quello che ho testato.

private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e) 
{ 
    CommandManager.RegisterClassInputBinding(
     typeof(TextBox), 
     new InputBinding(TestCommand, new KeyGesture(Key.S, ModifierKeys.Control))); 


    MessageBox.Show("CommandBinding_Executed_1"); 
} 

Questo metodo è chiamato Ctrl + H e registra nuovi input vincolante per Ctrl +S. Se premo Ctrl +S prima Ctrl +H non funziona, ma quando premo dopo lo fa.

ho controllato sender.InputBindings e c'era solo un legame (Ctrl +S) così ho concluso che RegisterClassInputBinding() non aggiunge l'associazione a ogni istanza esistente, ma invece memorizza attacchi associati alla classe e poi li confronta gesto gestita.

Ma allora perché non esiste il metodo RemoveClassInputBinding()? :(

Modifica


ho anche riuscito a fare ciò che ho inteso attraverso la riflessione, ma ancora non riesce a trovare il metodo nativo per questo, anche se sarebbe banale da implementare.

var fieldInfo = typeof(CommandManager).GetField(
    "_classInputBindings", BindingFlags.Static | BindingFlags.NonPublic); 
var fieldData = (HybridDictionary)fieldInfo.GetValue(null); 
var inputBindingCollection = (InputBindingCollection)fieldData[typeof(TextBox)]; 
foreach (var o in inputBindingCollection) 
{ 
    if (o == inputBinding) 
    { 
     MessageBox.Show("half way there"); 
    } 
} 
inputBindingCollection.Remove(inputBinding); 
+0

Stai cercando di implementare accordi chiave come in Visual Studio Se è così, questo? potrebbe essere utile: http://kent-boogaart.com/blog/multikeygesture – CodeNaked

risposta

7

ApplicationCommands.NotACommand è stato progettato proprio per questo scopo:

"T il suo comando è sempre ignorato e non gestisce l'evento di input che lo ha causato. Questo fornisce un modo per disattivare un ingresso vincolante integrato in un controllo esistente "

Per usare il tuo esempio:.

CommandManager.RegisterClassInputBinding(
    typeof(TextBox), 
    new InputBinding(
     ApplicationCommands.NotACommand, 
     new KeyGesture(Key.S, ModifierKeys.Control))); 
+0

sembra molto imperfetto per me. Sto scrivendo il gestore di scorciatoie che consentirebbe all'utente di aggiungere/rimuovere binding di input. Come ho capito se l'utente rimuove un binding come hai suggerito che il binding sarà ancora lì e si accumulerà ogni volta che l'utente lo fa. È corretto? –

+0

Che non lo so per certo, sto solo passando il consiglio da Microsoft. Posso dirti questo, però, l'uso di Reflection è sicuramente imperfetto. Passerò attraverso Reflector e vedrò se MS casi speciali NotACommand. – user7116

+0

Casi speciali CommandManager.TranslateInput (metodo interno) per assicurarsi che NotACommand non venga mai eseguito: "if ((comando! = Null) && (comando! = ApplicationCommands.NotACommand))". – user7116

Problemi correlati