Piszę niestandardowy formant i chciałbym, aby formant przełączył stan edycji na normalny stan, gdy użytkownik kliknie poza formant. Zajmuję się zdarzeniem LostFocus i to pomaga, gdy użytkownik odsuwa się lub klika na inną kontrolkę, która może być ustawiana. Ale jeśli nie klikną na coś, co można ustawić, nie będzie to miało wpływu na stan edycji. Mam więc dwa rozwiązania na uwadze:W jaki sposób sterowanie może obsługiwać kliknięcie myszą poza tym sterowaniem?
- Podejdź do drzewa na górę większości elementu, gdy idzie się do stanu edycji i dodać do obsługi
MouseDownEvent
(i uchwyt „obchodzić” wydarzenia). W programie obsługi wykopię sterowanie ze stanu edycji i usunę moduł obsługi z najbardziej elementowego elementu. Wydaje się to być trochę hackerem, ale prawdopodobnie działałoby dobrze.
Przykładowy kod:
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;
}
- Zastosowanie
Mouse.PreviewMouseDownOutsideCapturedElement
i dodać do obsługi moją kontrolą. W programie obsługi wykopię kontrolę ze stanu edycji. Ale wydaje mi się, że nie wyda się tego wydarzenia. Kiedy wyskoczy Mouse.PreviewMouseDownOutsideCapturedElement?
Przykład Kod:
AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler(EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent), true);
To zadziałało idealnie. Jedyne, co musiałem zrobić, to Przechwyć mysz, kiedy wszedłem do trybu edycji, a następnie WPF automatycznie odciąża obiekt od elementu po kliknięciu poza nim. Po tym, jak straciłem ostrość, musiałem tylko uważać na ReleaseMouseCapture(). Dzięki! – chrislarson
Jedyną rzeczą, na którą musiałem uważać, było to, że po naciśnięciu klawisza Windows lub uruchomieniu innej aplikacji straciłbym przechwytywanie myszy bez zatrzymania kontroli nad stanem edycji. Musiałem więc obsłużyć zdarzenie IsMouseCapturedChanged. Np. 'Private void CustomControlIsMouseCapturedChanged (obiekt nadawca, DependencyPropertyChangedEventArgs e) { if ((bool) e.NewValue == false) { IsEditing = false; } } ' – chrislarson