당신은 내가 이벤트 기반의 접근 방식을 사용 자식 창에 부모 창을 연관 자녀 윈도우의 Owner
속성을 사용하는 가정. 자녀 창에서
는 부모에서 자식 창을 해제 (분리)하는 리스너에 알리는 이벤트를 만들 :
public event EventHandler<EventArgs> DetachOwner;
이 이벤트가 발생한다시기를 결정하는 다음 필요. 이를 위해 우리는 자식 윈도우에서 세 가지 이벤트, 즉 Activated
, Deactivated
및 LocationChanged
을 사용합니다. 자식 창을 이동할 때
LocationChanged
우리를 말할 것이다 그러나 부모 창을 다음 있기 때문에 아이 윈도우가 이동할 때 우리는 경우를 필터링해야합니다. 이렇게하려면 우리는 자식 창이 움직이고 포커스가 있는지를 알아야합니다. 자식 창의 포커스 상태를 추적하려면 HasFocus
이라는 부울 필드를 만들고 Window의 Activated
이벤트 처리기에서 HasFocus
을 true로 설정하고 Window의 Deactivated
처리기에서 false를 설정합니다.
자녀 창에이 추가 :
private void Window_LocationChanged(object sender, EventArgs e) {
if (HasFocus) {
if (DetachChild != null) {
DetachChild(this, EventArgs.Empty);
}
}
}
bool HasFocus;
private void Window_Activated(object sender, EventArgs e) {
HasFocus = true;
}
private void Window_Deactivated(object sender, EventArgs e) {
HasFocus = false;
}
당신이 자식 윈도우의 DetachOwner
이벤트를 구독 할 수 있습니다 부모 창에서 자식 창 인스턴스화 할 때
_child = new Child();
_child.Owner = this;
// Subscribe to the DetachOwner event.
_child.DetachChild += Child_DetachOwner;
이 DetachOwner
핸들러 단지를
void Child_DetachOwner(object sender, EventArgs e) {
((Child)sender).Owner = null;
}
: null로 자식 윈도우의
Owner
속성을 설정
당신은 부모가 부모 창에서 핸들러와 자식 창에서 비슷한 AttachOwner 이벤트를 생성하여의에 자식 창을 다시 연결하기 위해이 방법을 확장 할 수 있습니다
void Child_AttachOwner(object sender, EventArgs e) {
((Child)sender).Owner = this;
}
이 문제를 해결! 매우 깨끗합니다. 잔뜩 고마워 Jay! –
문제 없으니 기꺼이 도와주세요. –