2010-01-12 35 views
32

Tôi có một số TextBoxToolBar với số Button. Nếu tôi đang nhập số TextBox và tôi nhấp vào số Button Tôi muốn TextBox để mất Focus để ràng buộc được cập nhật. Tôi không muốn thêm UpdateSourceTrigger=PropertyChanged vào số TextBox của mình. Nhưng thay vào đó, khi tôi nhấp vào Button, tôi đặt lại Focus thành cửa sổ chính, vì vậy những gì tôi từng mất Focus và cập nhật các ràng buộc.WPF Đặt lại tiêu điểm trên nút Nhấp vào

Tôi đã thử thêm một OnClick nút với những điều sau đây, nhưng nó dường như không làm việc:

private void Button_Click(object sender, RoutedEventArgs e) { 
     FocusManager.SetFocusedElement(this, null); 
    } 

Bất cứ lời khuyên sẽ được đánh giá.

Cảm ơn, Raul

Trả lời

25

Vấn đề là thanh công cụ đặt nút của bạn trong một khác nhau FocusManager.FocusScope. Điều đó có nghĩa rằng cả hai ButtonTextBox có thể nhận được tập trung hợp lý cùng một lúc, mỗi trong phạm vi riêng của nó. Điều này thường là một điều tốt, vì bạn thường không muốn mất tập trung trong khu vực cửa sổ chính của bạn khi bạn chọn các mục menu và các nút ToolBar, nhưng trong trường hợp của bạn nó đang ngăn chặn những gì bạn đang làm từ làm việc.

Mặc dù bạn có thể ghi đè thuộc tính FocusManager.IsFocusScope trên thanh công cụ và nhận được hiệu ứng bạn muốn, đây có lẽ không phải là kế hoạch tốt nhất vì nó sẽ làm cho tất cả các nút trên thanh công cụ khác cũng lấy nét từ khu vực cửa sổ chính của bạn.

Thay vào đó bạn có thể sử dụng một trong những giải pháp đơn giản:

  • Đặt nút của bạn bên ngoài Toolbar
  • Thêm một thể đặt tiêu điểm = kiểm soát "true" đến khu vực cửa sổ chính của bạn và tập trung vào nó khi nút được nhấp
  • thủ buộc các cập nhật bằng cách gọi textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
  • Tạm thời thiết đặt tiêu điểm = "true" trên một điều khiển trong cửa sổ chính, đặt trọng tâm vào nó, sau đó ngay lập tức có thể đặt tiêu = "false" một lần nữa
+0

Tôi đã thử Keyboard.Focus (mainWindow); nhưng điều đó dường như không thay đổi tiêu điểm. Nó vẫn còn trên hộp văn bản hoặc phần tử nào đã được chọn. Bây giờ tôi chỉ rõ ràng buộc phần tử vào UpdateSource() nhưng nó không có vẻ giống như một giải pháp bền vững lâu dài. Tôi sẽ thử thêm một điều khiển ghost để tập trung vào. – HaxElit

+1

'Keyboard.Focus (mainWindow)' sẽ chỉ hoạt động nếu "mainWindow" là Focusable (theo mặc định nó không phải là) và nếu nó nằm trong 'FocusScope' giống như' TextBox'. Hãy thử tạo một điều khiển 'Focusable =" true "' trong cùng một vùng chứa như TextBox và tập trung vào đó. Điều khiển khác có thể đơn giản là ''. Vì 'Control' không có mẫu mặc định nên nó sẽ không nhìn thấy được. –

+0

Tuyệt vời! Điều đó làm việc như một sự quyến rũ. Cảm ơn! – HaxElit

32

Tôi gặp sự cố tương tự. Tôi cần phải bỏ tiêu điểm một hộp văn bản khi nhập được nhấn. Tôi kết thúc bằng mã này:

var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus 
FocusManager.SetFocusedElement(scope, null); // remove logical focus 
Keyboard.ClearFocus(); // remove keyboard focus 

Tôi nghĩ rằng nó sạch hơn việc tạo điều khiển giả và có thể sử dụng lại được. Tôi không tự tin với giải pháp này mặc dù. Nhưng nó có vẻ hoạt động tốt.

+3

+1 Hoạt động như một nét duyên dáng trong sự kiện điều khiển GotFocus(). –

+3

Điều này làm việc cho tôi khi không có gì khác sẽ buộc một DatePicker phân tích cú pháp văn bản đã nhập khi nhấp vào nút lưu trong thanh công cụ. Mã bên dưới sử dụng chế độ xem (MVVM) như this.owner, được gọi từ ViewModel. var t = (DependencyObject) FocusManager.GetFocusedElement (this.Owner); var scope = FocusManager.GetFocusScope (t); FocusManager.SetFocusedElement (phạm vi, null); – Dave

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