2012-12-19 23 views
15

Tôi đập đầu vào những gì trông giống như một vấn đề đơn giản để sửa chữa trong wpf nhưng tôi vẫn chưa khám phá lý do tại sao tôi không thể làm cho ứng dụng của tôi hoạt động theo kế hoạch.Bàn phím.Tập trung không hoạt động trên hộp văn bản trong WPF

Tôi có một hộp tìm kiếm nhỏ bật lên trong ứng dụng wpf của tôi khi người dùng nhấn ctrl + f. Tất cả những gì tôi muốn là cho dấu nháy được nhấp nháy bên trong hộp văn bản hộp tìm kiếm, sẵn sàng nhận bất kỳ thông tin gì mà người dùng nhập vào mà không cần người dùng phải nhấp vào nó. Đây là mã xaml cho hộp văn bản hiển thị, được kích hoạt, có thể kiểm tra, tabstop và có thể lấy nét.

<TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" /> 

Trong mã phía sau, tôi có phương pháp này được gọi khi khả năng hiển thị của hộp tìm kiếm bị ảnh hưởng. hộp tìm kiếm được tải ở đầu ứng dụng.

/// <summary> 
    /// Handles events triggered from focusing on this view. 
    /// </summary> 
    /// <param name="sender">The sender.</param> 
    /// <param name="dependencyPropertyChangedEventArgs">The key event args.</param> 
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     if (!((bool) dependencyPropertyChangedEventArgs.NewValue)) 
     { 
      return; 
     } 

     SearchCriteriaTextBox.Focus(); 
     Keyboard.Focus(SearchCriteriaTextBox); 
     SearchCriteriaTextBox.Select(0, 0); 

     if (SearchCriteriaTextBox.Text.Length > 0) 
     { 
      SearchCriteriaTextBox.SelectAll(); 
     } 
    } 

Vấn đề là, mã được gọi, thành phần trở thành IsFocused = true nhưng không lấy tiêu điểm bàn phím. Tôi có thiếu gì đó không? Trừ khi một điều khiển khác giữ cho dữ liệu tập trung vào bàn phím mà tôi chắc chắn tôi đã không mã, tại sao đoạn mã khá đơn giản này sẽ không hoạt động đúng.

+2

Hãy thử làm điều đó sau sự kiện Đã tải. –

+1

Tôi đoán một điều khiển khác sẽ tập trung sau khi phương thức này được gọi. Có lẽ bạn nên tập trung vào một sự kiện khác. – Ramin

+0

@Chi tiết Tôi có một câu hỏi: Sự kiện có được kích hoạt cháy mỗi khi khả năng hiển thị thay đổi? – Ramin

Trả lời

50

Là một khắc phục, bạn có thể thử bằng cách sử dụng Dispatcher để thiết lập focus tại một DispatcherPriority sau, chẳng hạn như Input

Dispatcher.BeginInvoke(DispatcherPriority.Input, 
    new Action(delegate() { 
     SearchCriteriaTextBox.Focus();   // Set Logical Focus 
     Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus 
    })); 

Từ các mô tả về vấn đề của bạn, có vẻ như bạn không có bàn phím tiêu điểm bộ. WPF có thể có nhiều phạm vi tiêu điểm, vì vậy nhiều phần tử có thể có tiêu điểm lôgic (IsFocused = true), tuy nhiên chỉ có một phần tử có thể có tiêu điểm bàn phím và sẽ nhận được đầu vào bàn phím.

Mã bạn đã đăng phải đặt trọng tâm chính xác, vì vậy, một số thứ phải được thực hiện sau đó để di chuyển Tiêu điểm bàn phím ra khỏi số TextBox của bạn. Bằng cách đặt tiêu điểm ở mức độ ưu tiên của người điều phối sau, bạn sẽ đảm bảo rằng việc đặt tiêu điểm bàn phím thành SearchCriteriaTextBox được thực hiện sau cùng.

+1

Chỉ cần phát hiện ra rằng, đã được về để gửi phản ứng của riêng tôi, cảm ơn Rachel nó hoạt động hoàn hảo trong một môi trường đa luồng. EDIT: Bạn có thể gọi Dispatcher.BeginInvoke (DispatcherPriority.Input, new ThreadStart (() => SearchCriteriaTextBox.Focus())); để cùng một kết quả, mà không cần phải gọi tiêu điểm hộp văn bản – legrandviking

+0

Điều này làm việc cho tôi: MessageBox.Show ("foo"); myTextBox.Select (0, myTextBox.Text.Length); myTextBox.Tiêu điểm(); – Krafty

+0

Có ai có lời giải thích cho vấn đề này không? –

0

Nếu nó giúp bất cứ ai tôi gặp sự cố này và ứng dụng của tôi có cửa sổ chính với nhiều điều khiển người dùng được đặt trong các lưới riêng biệt với ràng buộc dữ liệu hiển thị. Bởi vì các lưới ở đó khi ứng dụng được xây dựng. Tập trung() được gọi là Loaded hoặc Constructor sẽ được gọi vào thời gian xây dựng, không phải ở thời gian hiển thị.

Nhưng dù sao tôi đã sửa nó bằng cách gọi hàm .Focus() trên sự kiện MouseEnter của lưới. Làm việc tốt cho tôi.

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