2012-06-11 4 views
1

C# WPF .NET 3.5에서 응용 프로그램을 개발 중입니다. 주 창 M이 있는데,이 창에서 모덜리스 자식 창 C1을 Window.Show() 메서드를 사용하여 설정되지 않은 Owner 속성으로 엽니 다. C1 창에서 다른 자식 창 C2를 만듭니다. C2에서 다른 자식 창 C3을 만듭니다. C2 및 C3은 모두 Modeless이며 Window.Show() 메서드로 만들고 Owner 속성을 설정하지 않습니다. 아래의 윈도우 시퀀스이다부모 대화 상자를 클릭 할 때 모덜리스 자식 대화 상자가 표시됩니다.

M은 -> C1 -> C2 ->

C3

다음 I 윈도우 동작을 원한다. C1이 클릭되고 C2가 열려 있으면 C2가 맨 위에 표시됩니다. C2가 위로 올라가거나 C2가 클릭되고 C3이 열려 있으면 C3가 맨 위로 이동합니다. M을 클릭하면 M이 맨 위에 와야합니다. 따라서 C1, C2 및 C3은 모달 창처럼 동작합니다. 그러나 C1, C2 및 C3을 모달로 사용하지 않으려합니다. 즉 소유자 속성이 설정된 Window.ShowDialog() 메서드를 사용하여 만들고 싶지 않습니다. 필요한 경우 사용자가 기본 창 M으로 이동할 수 있기를 원하기 때문입니다. 이 동작을 어떻게 수행 할 수 있습니까?

귀하의 도움에 미리 감사드립니다.

geekowl

업데이트 :

내가 제안에 따라 부모 창에 GotFocus 이벤트의 투수를 추가했지만 GotFocus 이벤트가 해고되지 않습니다. 그래서 Activated 이벤트 핸들러를 추가하고이 핸들러에서 Activate()라는 자식 윈도우를 추가했습니다. 이것은 거의 문제를 해결했지만 어떤 상황에서는이 접근법이 완벽하게 작동하지 않습니다. 예를 들어, 하위가 최소화되고 상위가 클릭되면 하위가 활성화되지만 하위가 자동으로 최대화되지 않습니다. 나는 Activate()를 사용하는 대신 다른 방법을 사용하여 아이를 맨 위로 데려 가려고했지만, 아무도 완벽한 솔루션을 제공하지 못했습니다. 궁극적으로이 메소드를 사용하여 하위 창을 표시 한 후 상위 창을 숨기고 하위 창을 닫으면 부모를 다시 표시합니다.

답변

2

Control.Focus() 메서드를 사용하여 창에 모두 참조가있는 경우이 작업을 수행 할 수 있어야합니다.

클릭하면 C2.Focus()를 호출하는 이벤트 처리기를 C1에 추가합니다. C3.Focus()를 호출하는 C2에서 동일한 작업을 수행합니다.

귀하의 질문에서 수집 한 내용을 바탕으로, 당신이 처리기를 추가하는 가장 좋은 이벤트는 C1 및 C2 창에 GotFocus 이벤트가 될 것이라고 생각합니다. 기본적으로 포커스를 얻을 때마다 자녀 윈도우가 열려 있는지 확인한 다음 하위 윈도우에서 Focus()를 호출합니다. 이 창에서 GotFocus가 실행됩니다 (사용자가 C1을 클릭하면 C2가 맨 위에오고 C3가 맨 위에 표시됩니다).

+0

대단히 감사합니다. 어떤 이벤트 리스너를 사용할 수 있습니까? – geekowl

+0

위 항목을 업데이트하여 사용 하시길 권장하는 이벤트 처리기를 포함 시켰습니다. –

+0

위의 질문을 업데이트했습니다. 제안 해 주셔서 감사합니다. 그들은 정말 큰 도움이되었습니다. 그들은 올바른 해결책을 찾는데 도움이되었습니다. 난 정말 당신의 도움을 주셔서 감사합니다. – geekowl

관련 문제