WPF 앱이 창을 닫으면 포커스가 완전히 흐트러진다.
문제 설명
[ the [Owner]를 표시하는 MessageBox
이 자식 창 내에서 자식 창을 닫으면 부모 창의 포커스가 흐려집니다.Windows 탐색기 또는 다른 앱이 열려 있으면 이 앱이 포커스를 받아 메인 창이 숨겨집니다.
이것은 다른 뉴스그룹에서 보았던 것처럼 알려진 문제인 것 같습니다만, 좋은 해결책은 보이지 않습니다.에서 소유자를 null로 설정하다OnDeactivate
선택사항이 아닙니다." " 를 하기 전에 한다.MessageBox
소유자를 null로 OnClosed
이벤트도 도움이 되지 않습니다.
심플한 솔루션 발견
한 것과 다음 .OnClosing
모든 자창 중에서요
void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (null != Owner) {
Owner.Activate();
}
// ....
}
에, 한층 더 로직을 실행할 수 또, 심지어, 이 로직도 열 수 있습니다. 이치노MessageBoxes
인됩니니다다
예-코드
생각보다 문제가 더 큰 것 같아요.다음 예제에서는 메시지 상자가 열리고 하위 창이 닫히면 상위 창의 포커스를 제거합니다(Windows의 로드된 이벤트 핸들러에 코드를 복사).
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
Button button = new Button() { Content="MessageBox"};
button.Click += delegate { MessageBox.Show("Klicking her breaks the focus-chain."); };
firstChildWindow.Content = button;
firstChildWindow.Show();
또, 다음의 예에서는, 포커스 체인이 끊어집니다.
Window firstChildWindow = new Window() {
Title = "Floating Window", Width = 100, Height = 70
};
firstChildWindow.Owner = Window.GetWindow(this);
firstChildWindow.Show();
Window secondChildWindow = new Window() { Title="Second Window", Width=100, Height=70};
secondChildWindow.Content = new TextBlock() { Text="SecondWindow"};
secondChildWindow.Owner = firstChildWindow;
secondChildWindow.Show();
누군가 이 문제에 대한 해결책을 가지고 있다. 또는 Dispatcher를 해킹에 대해 합니다.DispachterTimer
또는 닫혔을 때 수동으로 부모에게 포커스를 강제하는 것이 효과적일 수 있지만, 이 모든 것이 매우 부정적으로 보입니다(또한 현재 앱에서와 같이 같은 부모에게 액티브하게 소유되는 창이 더 있다면 조금 복잡할 수도 있습니다.
아무도 이 문제에 대한 멋진 해결책을 몰라?
자원.
MSDN Description(모달 이외의 창이 열려 Show()를 호출하는 경우의 코멘트 아래 참조)
적절한 해결책이 없는 MSDN 포럼에서도 동일한 문제가 발생함
다음 항목도 참조하십시오.WPF 앱의 불안정한 포커스
여기서 가장 가능성이 높은 것은 두 개의 독립된 최상위 창이 있고 그 중 하나를 닫은 것입니다.이로 인해 포커스가 다른 응용 프로그램으로 이동할 수 있습니다.
이 문제는 하나의 창이 두 번째 창을 소유하는 경우에도 발생합니다. 두 번째 창이 세 번째 창을 소유합니다.Win32 API에 BUG가 있을 가능성이 높지만, 그것은 영원히 우리와 함께할 것이기 때문에, 그것을 수정해 주세요.
이 문제를 해결하려면 손자의 닫힘 이벤트에서 수동으로 자식에게 포커스를 되돌려야 합니다.하지만 이 경우 손자는 메시지 박스이기 때문에 그렇게 할 수 없습니다.가장 쉬운 방법은 부모에게 메시지 상자를 소유하는 것입니다.다음으로 가장 쉬운 방법은 메시지 상자 컨트롤을 직접 만드는 것입니다.
이것은 매우 귀찮은 버그입니다.가장 일반적인 솔루션은 다음과 같습니다.
불러Me.Owner.Focus
에서Window_Unloaded
또는Window_Closing
이벤트입니다.
그래도 100%는 동작하지 않습니다.포커스가 올바르게 복원되기 전에, 백그라운드창이 (매우 짧게) 점멸하는 것을 볼 수 있습니다.
보다 효과적인 방법을 찾았습니다.
불러Me.Owner.Activate
전에Me.Close
(또는_Closing
이벤트).
2020년에도 여전히 문제가...
Wpf의 회피책:
public ContactsWindow()
{
InitializeComponent();
Closing += ContactsWindow_Closing;
}
private void ContactsWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Owner?.Activate();
}
어떤 뉴스에든 관심이 있는 나에게 효과가 있는 것 같다.
아마도 나는 그 문제에 꽤 늦은 것 같다.
@HCL 이 문제는 MessageBox.show()의 옵션 파라미터를 MessageBoxOptions로 설정하면 보다 쉽게 해결할 수 있습니다.없어요.
건배...
독자적인 메시지 박스를 작성할 수 있습니다.표시되었을 때 화면 전체를 무효로 하는 플로터로 실장할 수 있습니다.
caliburn mvm frameork 샘플을 체크하면 messagebox as service의 훌륭한 구현이 있습니다.
소유권은 창 활성화와는 무관합니다.이를 확인하려면 두 번째 창의 소유자를 맨 위 창으로 변경하고 프로그램을 실행하십시오.아무것도 변하지 않는다는 점에 주의해 주세요.소유권은 "창이 최소화되면 최소화해야 하는 다른 창"과 관련이 있습니다.따라서 커스텀 액티베이션 코드를 사용해야 합니다.
Johsua's.활성화(상기 참조) 솔루션은 모든 종류의 창 유형에서 매우 적절하게 작동합니다.적어도 나한테는 효과가 있었어.
나도 비슷한 문제가 있었다.메인 창이 하나 있었는데, Owner 속성을 통해 나머지 아이 창이 해당 창에 할당되었습니다.메인창에 두 명 이상의 자녀가 있는 경우 둘째 아이가 닫히면 앱의 포커스가 흐려집니다.나는 아이를 가지고 속임수를 썼다.닫기 전에 소유자 =이(가) null이지만 다음 자식 창의 포커스가 흐려집니다.아이를 모두 데리고 아이를 닫기 전 마지막 아이에 초점을 맞춥니다.다음은 코드 예시입니다.
private void OnClosing(object sender, CancelEventArgs cancelEventArgs)
{
var childWindows = (sender as Window).Owner.OwnedWindows;
if (childWindows.Count - 2 >= 0)
childWindows[childWindows.Count - 2].Focus();
else
{
(sender as Window).Owner.Focus();
}
(sender as Window).Owner = null;
}
언급URL : https://stackoverflow.com/questions/3144004/wpf-app-loses-focus-completely-on-window-close
'programing' 카테고리의 다른 글
Array Excel VBA 요소의 반환 색인 (0) | 2023.04.12 |
---|---|
Xcode 4는 타겟 디바이스에서 "finished running"이라고 표시되며, 아무 일도 일어나지 않습니다. (0) | 2023.04.12 |
SQL Server에서 캐스케이드 삭제를 사용하는 방법 (0) | 2023.04.07 |
기능 vsSQL Server에 저장 프로시저 (0) | 2023.04.07 |
T-SQL에서 퍼센트 부호를 이스케이프하려면 어떻게 해야 하나요? (0) | 2023.04.07 |