2011-03-28 8 views
12

Window.Owner의 기능을 모두 사용하지 않고 가져올 수 있습니까?WPF에서 항상 맨 위의 동작이없는 창 소유자

두 개의 창, 창 A와 창 B가 있습니다. 둘 중 하나를 선택하면 다른 응용 프로그램 위에 가져 오지만 둘 중 하나를 다른 응용 프로그램 위에 겹쳐 쓸 수 있도록 만들고 싶습니다. (사실 두 개 이상은 있지만 두 가지 모두 비슷하게 동작해야합니다.)

창 B의 Owner을 A로 설정하면 두 창 중 하나로 전환하면 다른 응용 프로그램보다 앞선 두 개가 나타납니다. B가 항상 A (내가 원하지 않는)의 꼭대기에 앉도록 강요합니다.

실제로는 이미 창 계층을 Owner/OwnedWindows과 독립적으로 추적하는 코드가 있으므로 활성화 문제를 해결할 수 있도록 확장 할 수 있습니다. 그래서 그 문제를 단순화하는 경우, 내가 찾는 대체 답변은 다음과 같습니다.

실제로 어떻게해야합니까?이 창을 사용자가 활성화하면 특정 창 (모든 다른 창) 서로의 상대적인 기존 Z- 주문을 유지하면서 저 아래 Z- 주문까지 "?

+1

+1 동일한 요구 사항이 있습니다. 이미 해결책을 찾았 니? z- 순서 질문 : 스택 (그냥 목록 )을 유지하고 모든 Windows의 Activated 이벤트에 등록하여이 작업을 수행 할 수 있습니다. 각 이벤트에서 winodw를 스택에서 제거하고 맨 위에 둡니다 (== list.Add). 목록의 foreach 창은 foreground에 연결됩니다 (interop 사용). – stijn

+0

아직 다른 해결책을 찾지 못했습니다. 아래의 Todd의 답변은 유망 해 보이고 아마도 (내가 더 나은 것이 나오지 않는 한) 내가 사용하게 될 것입니다. 그러나이 프로젝트가 다시 태어 났으므로 아직 테스트하지 않았습니다. (그래서 나는 아직 답을 쳤다. 나는 약속한다. 나는 결국 다시 돌아올 것이다!) – Miral

답변

4

가능한 해결책 중 하나는 앱의 모든 창을 소유하는 숨겨진 창을 만드는 것입니다.

<Window 
    Opacity="0" 
    ShowInTaskbar="False" 
    AllowsTransparency="true" 
    WindowStyle="None"> 

것은 당신의 App.xaml에서 StartupUri를 제거하십시오 :

당신은 그에게 뭔가를 선언 할 것입니다. 또 다른 어려움은 당신이 실제 응용 프로그램을 종료 처리하는 방법이 될 것입니다

protected override void OnStartup(StartupEventArgs e) 
{ 
    HiddenMainWindow window = new HiddenMainWindow(); 
    window.Show(); 

    Window1 one = new Window1(); 
    one.Owner = window; 
    one.Show(); 

    Window2 two = new Window2(); 
    two.Owner = window; 
    two.Show(); 
} 

: 그리고 당신의 App.xaml.cs를 당신이 뭔가를보고 OnStartup 오버라이드 (override)합니다. 이러한 창 중 하나가 MainWindow로 간주되면 응용 프로그램 ShutdownMode를 ShutdownMode.OnMainWindowClose로 변경 한 다음 MainWindow 속성을 해당 창 중 하나에 설정할 수 있습니다. 그렇지 않으면 모든 창이 닫힐 때를 결정하고 종료를 명시 적으로 호출해야합니다.

+0

이것은 실제로 거의 완벽하다. 닫기/최소화/복원 처리는 너무 어렵지 않습니다. 이벤트 수집기를 사용하고 있습니다. 창 생성/변경시 이벤트를 게시하고 모든 이벤트의 중앙 목록을 유지합니다. 내가 찾은 유일한 탈퇴는 alt-tab 창에서 투명한 소유자 윈도우로 인해 빈 항목 (아이콘 제외)이 표시된다는 것입니다. – stijn

관련 문제