2009-09-22 35 views
15

türetilen kontrol alanı anahtarı denir değil onkeydown(), bunu gibi TextBox türemiş bir kontrol:WPF: WPF uygulamasında WPF TextBox

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

onkeydown yöntem değildir TextBox'a bir boşluk girerken veya Backspace'e isabet ederken çağrılır, ancak normal yazdırılabilir karakterler (örn. 'a') ve değiştirici tuşlar (örn.) içeren diğer girişler için yangın yapar. Ben seçilebilir, düzenlenemeyen metni görüntülemek böylece ben IsReadOnly ile bu denetimi kullanıyorum

true olarak ayarlanır. WPFToolkit'in DataGrid'inde kullanılan kontrol ve ben de KeyDown olaylarının, SelectableTextBlock'un odağı olsa bile veri ızgarasını yaymasını istiyorum, bu yüzden olayı açıkça işlenmemiş olarak işaretlemek için özel bir kontrol kullanıyorum. Sorun şu ki, bu olay belirli anahtarlar için kontrolümde bile bunu yapmadı. Bunu elde etmek için DataGrid'de OnPreviewKeyDown'ı kullanamıyorum, çünkü veri ızgarasında kullanılan diğer kontrollerin KeyDown olayını yutmasını istiyorum.

Anahtar anahtarının yayılması için KeyDown olayını nasıl alabileceğimi bilen var mı?

Teşekkürler.

cevap

12

Sorun benim türetilmiş denetime kadar kabarcıklar önce uzay (ve geri silme vs.) tuşu basılı olay, TextBox içinde zaten ele ediliyor olmasıdır görünüyor. Wim'in yayınladığı gibi, metin kompozisyon sürecinin bir parçası olarak kabul ediyorum.

Bu geçici çözüm için, zaten ele alınmış olsa bile, anahtar aşağı olayı alacak olan bir işleyiciyi ekledim ve Handled öğeyi, normal olarak köpürmeye devam etmesini sağlamak için yanlış olarak ayarlar. Aşağıdaki örnekte, bu sadece boşluk tuşları için yapar, ama benim durumumda, bunu ne yapmam gerektiği gibi, gerçekten gerçekten de SelectedableTextBlock'umda işlenmesini istemediğim herhangi bir önemli olay için bunu yapmam gerekecek. Ana olaylar ebeveynlerle ilgilenebilir.

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; 
     } 
    } 
    ... 
} 

ben ... herkes daha iyi bir çözüm varsa hala ilgileniyor elbette

Teşekkür duyuyorum E.

2

Bu sorunu bir metin kutusunda bir kez boşluklarla ve olaylarla yaşadım. Olaylar, yalnızca bir boşluk karakteri eklediğinizde veya kaldırdığınızda tetiklenmiyor mu?

Bu

bir cevap olarak ne var: Bazı IME'lerin metin kompozisyon sürecinin bir parçası olarak boşluk tuş tedavi Çünkü ( http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b)

o TextInput aracılığıyla doğru birleştirilmiş metni rapor etmek Avalon tarafından yiyor neden işte Etkinlik.

Ben kapsam ama bu konu okuma tamamen olabilir

emmideatly bana zamanlar vardı bu konuda düşündürdü.

Saygılarımızla Wim

+0

Cevabınız için teşekkür ederiz, Wim. Bu, ilgili bir sorun gibi görünüyor. Olayın boşluk karakterleri ve geri boşluk için tetiklenmediğini ve tuş basımlarını sildiklerini tespit ettim. senin durumda boşluk tuşuna basın durdurmaya çalışıyorlardı Oysa metin kutusuna tarafından ele ve önizleme ele alarak yaptım ediliyor, kendim için işe yaramaz bu nedenle bu ebeveyne kadar etkinlik balonunu izin denetimlerini çalışıyorum . El ile anahtar aşağı olayları işlemek ve bunları işlenecek şekilde ayarlayan bir geçici çözümüm var. Orijinal soruma ilişkin kodu orijinal soruma cevap olarak gönderirim. Hala daha iyi bir yol olmalı diye düşünüyorum. sayesinde E. – Ergwun

+0

okumalıymışım O: "Ben olayları aşağı ele anahtarı kolları ve işlenmeyen * olarak ayarlar * geçici bir çözüm var." – Ergwun

2

TextBox RestrictKeysTextBox, söz türevi.

public class RestrictKeysTextBox : TextBox 
{ 
    .... 
} 

RestrictKeysTextBox'taki OnPreviewKeyDown olayını geçersiz kılın.Böyle bu geçersiz kılma

koyun mantığı:

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

Bind sizin DataGrid'e RestrictKeysTextBox örneği. DataGrid'de OnPreviewKeyDown geçersiz kılma olmadan işe ve ilişkili problemleri ortadan kaldırmak gerekir

.

14

PreviewKeyDown olayı bu tür bir şey için tam olarak var.

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

Kişisel KeyDown işleyicisi boşluk için KeyDown olayı almak asla.

+1

.NET 4.5 – Logan

+2

için çalışmıyor. Benim için çalışıyor. Net 4.6.1 – Dabblernl