Tôi đang viết điều khiển tùy chỉnh và tôi muốn điều khiển chuyển từ trạng thái chỉnh sửa sang trạng thái bình thường khi người dùng nhấp vào kiểm soát. Tôi đang xử lý sự kiện LostFocus và giúp khi người dùng bỏ đi hoặc nếu họ nhấp vào một điều khiển khác có thể tập trung. Nhưng nếu họ không bấm vào một cái gì đó Focusable, nó sẽ không chuyển ra khỏi trạng thái chỉnh sửa của nó. Vì vậy, tôi có hai giải pháp trong tâm trí:Làm cách nào một điều khiển có thể xử lý một cú nhấp chuột bên ngoài điều khiển đó?
- Đi bộ lên cây để các yếu tố nhất hàng đầu khi nó đi vào một trạng thái chỉnh sửa và thêm một handler cho
MouseDownEvent
(và xử lý "xử lý" các sự kiện). Trong trình xử lý, tôi muốn kiểm soát trạng thái chỉnh sửa của nó và loại bỏ trình xử lý khỏi phần tử trên cùng. Điều này có vẻ như một chút của một hack, nhưng nó có lẽ sẽ làm việc tốt.
Ví dụ mã:
private void RegisterTopMostParentMouseClickEvent()
{
_topMostParent = this.FindLastVisualAncestor<FrameworkElement>();
if (_topMostParent == null)
return;
_topMostParent.AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(CustomControlMouseDownEvent), true);
}
private void UnRegisterTopMostParentMouseClickEvent()
{
if (_topMostParent == null)
return;
_topMostParent.RemoveHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(CustomControlMouseDownEvent));
_topMostParent = null;
}
- Sử dụng
Mouse.PreviewMouseDownOutsideCapturedElement
và thêm một handler để kiểm soát của tôi. Trong trình xử lý, tôi muốn kiểm soát trạng thái chỉnh sửa của nó. Nhưng tôi dường như không nhận được sự kiện để bắn. Khi nào Mouse.PreviewMouseDownOutsideCapturedElement bị khởi động?
Ví dụ mã:
AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler(EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent), true);
Vì vậy, điều này làm việc hoàn hảo. Tất cả những gì tôi phải làm là Chụp chuột khi tôi vào chế độ chỉnh sửa, sau đó WPF tự động lấy nét ra khỏi phần tử khi bạn nhấp vào bên ngoài phần tử đó. Sau khi tôi mất tập trung, tôi chỉ cần cẩn thận với ReleaseMouseCapture(). Cảm ơn! – chrislarson
Điều duy nhất khác mà tôi phải cẩn thận là khi bạn nhấn phím cửa sổ hoặc một ứng dụng khác khởi chạy, tôi sẽ mất hoạt động chụp chuột mà không ngăn điều khiển của tôi ở trạng thái chỉnh sửa. Vì vậy, tôi đã phải xử lý sự kiện IsMouseCapturedChanged. Ví dụ: 'private void CustomControlIsMouseCapturedChanged (đối tượng người gửi, DependencyPropertyChangedEventArgs e) { nếu ((bool) e.NewValue == false) { IsEditing = false; } } ' – chrislarson