我正在寫一個自定義控件,並且希望控件在用戶單擊控件時從編輯狀態切換到正常狀態。我正在處理LostFocus事件,這有助於當用戶退出或者他們點擊另一個Focusable控件時。但是如果他們沒有點擊Focusable,它將不會退出編輯狀態。所以我心裏有兩個解決方案:控件如何處理鼠標在該控件之外的點擊?
- 走到樹最頂端的元素,當它進入到編輯狀態,並添加一個處理
MouseDownEvent
(和處理「處理」事件)。在處理程序中,我會將控制權踢出編輯狀態,並從最上面的元素中移除處理程序。這似乎有點破解,但它可能會運行良好。
示例代碼:
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;
}
- 使用
Mouse.PreviewMouseDownOutsideCapturedElement
,並添加一個處理程序我的控制。在處理程序中,我會將控制權踢出編輯狀態。但我似乎沒有得到事件的火力。 Mouse.PreviewMouseDownOutsideCapturedElement何時被啓動?
示例代碼:
AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler(EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent), true);
所以這個工作很完美。我所要做的只是在進入編輯模式時捕捉鼠標,然後當點擊它之外時,WPF會自動將焦點從元素上移開。在失去焦點後,我只需要小心ReleaseMouseCapture()。謝謝! – chrislarson
我唯一需要注意的其他事情是,當您按下Windows鍵或其他應用程序啓動時,我將失去鼠標捕捉而不停止我的控件進入編輯狀態。所以我不得不處理IsMouseCapturedChanged事件。例如,private void CustomControlIsMouseCapturedChanged(object sender,DependencyPropertyChangedEventArgs e) if((bool)e.NewValue == false) IsEditing = false; } }' – chrislarson