[WinUI 3] 마우스 왼쪽 클릭 시 포커스를 잃어버리는 문제

WinUI 3에서 포커스를 받을 수 있는 컨트롤을 만들 때 이상한 동작 상황을 해결하지 못해 질문을 올립니다.

테스트 프로젝트를 다운로드 해서 재현할 수 있습니다. WinUI 3 1.0이 설치되어 있어야 합니다.

사용자 컨트롤을 IsTabStoptrue로 줘 포커스 받을 수 있도록 하고, 강제로

Focus(FocusState.Programmatic);

를 해서 포커스 상태로 만들 후, OnPreviewKeyDown()에서 키 입력을 잘 받는 것을 확인했습니다.

image

그런데, 이 상태에서 마우스 왼쪽 버튼을 클릭하면 포커스를 잃어 버립니다.

image

신기하게도 마우스 중간 버튼과 오른쪽 버튼을 눌렀을 때는 해당 증상이 발생하지 않습니다.

이것을 해결하기 위해

        protected override void OnTapped(TappedRoutedEventArgs e)
        {
            // Force focus, it's working
            Focus(FocusState.Programmatic);
        }

클릭 했을 때 다시 강제로 포커스를 가지는 것으로 해결했습니다. 그런데,

마우스 왼쪽 버튼을 클릭하고-이동후-놨을 때는 적용이 안되어서,

        protected override void OnPointerReleased(PointerRoutedEventArgs e)
        {
            // Force focus but not working
            Focus(FocusState.Programmatic);
        }

이 부분도 적용을 헀는데 Focus()가 호출됨에도 불구하고 이후 포커스를 잃어 키 입력을 감지하지 못합니다.

혹시 관련 경험이 있으시거나 힌트를 가지고 계신 분 도움을 부탁 드립니다.

1개의 좋아요

일단 정확한 원인은 알 수 없으나 다음의 꽁수로 해결은 되었습니다.

        protected override void OnPointerReleased(PointerRoutedEventArgs e)
        {
            // Force focus but not working
            Focus(FocusState.Programmatic);
        }

이것을,

        protected override void OnPointerReleased(PointerRoutedEventArgs e)
        {
            DispatcherQueue.TryEnqueue(() => Focus(FocusState.Programmatic));
        }

이렇게 바꿔줬습니다. OnPointerReleased()가 UI 스레드에서 동작할 텐데 이렇게 해서 해결되었다는 것은 DispatcherQueue.TryEnqueue()가 UI 스레드여도 일단 인큐를 하고 다음 타임 때 처리하는 것 같습니다.

1개의 좋아요

실행 했더니 프로필을 실행하는 방법을 모릅니다 라는 오류가 나서
아무튼 … 혹시 다음줄을 추가해도 그런가요 ?

e.Handled = true;

넵.

살펴봐주셔서 감사합니다.


실행이 안되는 이유는 아마

구성이 안되어 있어서 인것 같습니다.

1개의 좋아요

[Visual Studio 2022 VSIX 확장용 단일 프로젝트 MSIX 패키징 도구를] 설치합니다.

이거 였군요. 감사드립니다.

1개의 좋아요

아래 코드를 추가해 보세요.

            this.InitializeComponent();
            test.AllowFocusOnInteraction = false;
1개의 좋아요

위 링크 주소는 이전 버전 이군요.

Windows App SDK

다시 정정 합니다.

1개의 좋아요