2009-06-15 18 views
7

Tüm türüne ciltleme eklemek için CommandManager.RegisterClassInputBinding kullanıyorum. Şimdi onu kaldırmak istiyorum.CommandManager.RegisterClassInputBinding ile eklenen giriş bağlaması nasıl kaldırılır?

Test ettiğim şey budur.

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"); 
} 

Bu yöntem, + HCtrl olarak adlandırılan ve Ctrl + S için bağlayıcı yeni giriş kaydeder edilir. Ben Ctrl + H önce Ctrl + S basarsanız çalışmıyor, ama öyle sonra bunu bastığımda.

Ben sender.InputBindings teslim ve sadece bir bağlayıcı (Ctrl + S) vardı bu yüzden RegisterClassInputBinding() mevcut her örneğine bağlama eklemez sonucuna yerine sınıfa ilişkili bağlamaları depolar ve daha sonra bunları karşılaştırır bir jest

Ama neden RemoveClassInputBinding() yöntemi yok? :(

Düzenleme


Hatta o uygulamak için önemsiz, buna rağmen bunun için yerli yöntem bulamıyorum hala yansıma yoluyla istediği her şeyi yapmayı başardı, ancak.

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

Eğer öyleyse, Visual Studio gibi anahtar akorları uygulamak için arıyorsunuz bu? yararlı olabilir: http://kent-boogaart.com/blog/multikeygesture – CodeNaked

cevap

7

ApplicationCommands.NotACommand sadece bu amaç için tasarlanmıştır:

"T onun komutu her zaman göz ardı edilir ve ona neden olan giriş olayını işlemez. Bu mevcut bir kontrol yerleşik bağlayıcı bir girişini kapatmak için bir yol sağlar "

senin örneğini kullanmak için:.,

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

bana çok kusurlu görünüyor.Kullanıcı giriş bağlamaları eklemek/kaldırmak için izin verecek kısayollar yöneticisi yazıyorum.Kullanıcı olarak bir bağlayıcı kaldırır eğer anladım Bağlanmanın hala orada olacağını ve kullanıcının bunu yaptığını her seferinde biriktirdiğini düşündünüz. Bu doğru mu? –

+0

Kesin olarak bilmediğimden, tavsiyeden geçiyorum. Microsoft'tan. Bunu size söyleyebilirim, Reflection kullanmak kesinlikle kusurludur. Reflector'a gideceğim ve MS özel vakalarının NotACommand olup olmadığını göreceğim. – user7116

+0

CommandManager.TranslateInput (iç yöntem) NotACommand'ın hiçbir zaman çalıştırılmayacağından emin olmak için özel durumlar: "if ((command! = Null) && (command! = ApplicationCommands.NotACommand))). – user7116

İlgili konular