2013-05-08 6 views
3

나는 이것에 대한 몇 가지 게시물을 보았습니다.하지만 질문에 정확하게 대답하지는 않습니다.사용자가 WPF에서 윈도우를 이동했는지 감지합니다.

부모 창이있어서 LocationChanged 이벤트가 발생하면 하위 창을 움켜 잡고 "스냅 된"방식으로 이동합니다. 나는 이벤트를 찾으려하고 사용자가 이동 자식 창보다는 내 부모 창을 이동하면 감지 할 수있는 방법이 있나요 "if the user has manually moved me, I will not re-attach to the parent."

말을 자식 폼에 부울 값을 설정?

나는 이것이 의미가 있기를 바랍니다.

답변

5

당신은 내가 이벤트 기반의 접근 방식을 사용 자식 창에 부모 창을 연관 자녀 윈도우의 Owner 속성을 사용하는 가정. 자녀 창에서

는 부모에서 자식 창을 해제 (분리)하는 리스너에 알리는 이벤트를 만들 :

public event EventHandler<EventArgs> DetachOwner; 

이 이벤트가 발생한다시기를 결정하는 다음 필요. 이를 위해 우리는 자식 윈도우에서 세 가지 이벤트, 즉 Activated, DeactivatedLocationChanged을 사용합니다. 자식 창을 이동할 때

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; 
} 
+0

이 문제를 해결! 매우 깨끗합니다. 잔뜩 고마워 Jay! –

+0

문제 없으니 기꺼이 도와주세요. –

관련 문제