2012-04-24 31 views
10

Các sự kiện sau đây có thể được sử dụng, nhưng, họ phải đính kèm cho mỗi phần tử:Có thể phát hiện sự kiện lấy nét bàn phím trên toàn cầu không?

GotKeyboardFocus, LostKeyboardFocus

Có cách nào trong .NET WPF trên toàn cầu phát hiện nếu các yếu tố tập trung thay đổi? mà không cần phải thêm trình xử lý sự kiện cho tất cả các yếu tố có thể có?

Trả lời

3

Bạn có thể treo vào sự kiện tunneling preview:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="350" Width="525" 
    PreviewGotKeyboardFocus="Window_PreviewGotKeyboardFocus" 
    PreviewLostKeyboardFocus="Window_PreviewLostKeyboardFocus"> 
.... 

Bằng cách này, như trình bày ở trên, cửa sổ sẽ được thông báo trước khi tất cả con cháu khi bất kỳ của các hậu duệ được hay mất tập trung bàn phím.

Đọc this để biết thêm thông tin.

+1

Có vẻ như phương pháp này có thể dẫn đến kết quả không chính xác do thực tế là sự kiện xem trước và do đó thay đổi trọng tâm có thể không thực sự xảy ra. Điều này sẽ xảy ra nếu một UIElement giữa cửa sổ và phần tử nguồn đánh dấu sự kiện là đã xử lý. – Hank

+0

Tôi đồng ý với @Hank. PreviewXxx không đảm bảo nó sẽ thực sự thay đổi. Câu trả lời của Vaccano thực sự là câu trả lời đúng. Nicolas cũng có một sự thay thế mặc dù nó không hoàn toàn giống nhau, vì tất cả mọi người trong chuỗi được thông báo nhờ sự sụp đổ cho các sự kiện được xử lý. – MarqueIV

5

Bạn có thể thêm trình xử lý sự kiện được định tuyến vào cửa sổ chính và chỉ định bạn quan tâm đến các sự kiện được xử lý.

mainWindow.AddHandler(
    UIElement.GotKeyboardFocusEvent, 
    OnElementGotKeyboardFocus, 
    true 
); 
+0

Đã hoạt động hoàn hảo! Cảm ơn nhiều! – Alexey

12

Bạn có thể làm điều này trong bất kỳ lớp với điều này:

//In the constructor 
EventManager.RegisterClassHandler(
     typeof(UIElement), 
     Keyboard.PreviewGotKeyboardFocusEvent, 
     (KeyboardFocusChangedEventHandler)OnPreviewGotKeyboardFocus); 

...

private void OnPreviewGotKeyboardFocus(object sender, 
             KeyboardFocusChangedEventArgs e) 
{ 

    // Your code here 

} 
0

Hãy nhìn vào cách Microsoft kích hoạt CommandManager.RequerySuggested sự kiện khi thay đổi trọng tâm: họ đăng ký vào InputManager.PostProcessInput sự kiện.

ReferenceSource

đơn giản ví dụ:

static KeyboardControl() 
{ 
    InputManager.Current.PostProcessInput += InputManager_PostProcessInput; 
} 

static void InputManager_PostProcessInput(object sender, ProcessInputEventArgs e) 
{ 
    if (e.StagingItem.Input.RoutedEvent == Keyboard.GotKeyboardFocusEvent || 
     e.StagingItem.Input.RoutedEvent == Keyboard.LostKeyboardFocusEvent) 
    { 
     KeyboardFocusChangedEventArgs focusArgs = (KeyboardFocusChangedEventArgs)e.StagingItem.Input; 
     KeyboardControl.IsOpen = focusArgs.NewFocus is TextBoxBase; 
    } 
} 

này cũng làm việc trong các ứng dụng đa cửa sổ.

Các vấn đề liên quan