2010-01-04 2 views
3

standart WPF TabControl을 향상시키고 있습니다. 도킹 해제 기능을 추가하고 싶습니다. 사용자가 TabControl 밖에있는 페이지를 드래그하여이 페이지를 창에서 드래그 해제합니다. 이 컨트롤에 두 개의 이벤트가 필요합니다. PageDragStart (페이지가 바깥쪽으로 끌 때 발생) 및 PageDragEnd (페이지가 바깥으로 떨어질 때 발생)컨트롤 외부에 놓기

첫 번째 이벤트에는 아무런 문제가 없습니다.

하지만 두 번째 ... OnDrop은 항목이 tabcontol 컨테이너 외부로 떨어 졌기 때문에 호출하지 않습니다. 어떻게 떨어 졌는지 어떻게 알 수 있습니까?

P. 나는 보편적 인 컨트롤을 원합니다 (도킹 해제 기능이 연결되어서는 안되며 tabcontrol이 배치 된 것과 같이 하드 코딩되어 있어야합니다.)

+0

음 ... 몇 가지 이유로 답변을 추가 할 수 없습니다. 질문 : 드래그하려는 컨트롤에 AllowDrop을 설정 했습니까? –

+0

Windows 양식에서이 트릭을했습니다. OnMouseUp은 TabControl 외부에서도 호출하고있었습니다.불행히도 WPF에서이 트릭이 작동하지 않습니다. – xSeder

+0

제 컨트롤이 다른 컨트롤에 대해 알지 못하는 블랙 박스가됩니다. 물론 응용 프로그램에서 사용할 때 모든 surrouding 컨트롤에는 AllowDrop이 true로 설정되어 있습니다. 문제는 OnDrop (또는 OnMouseUp - 중요하지 않음)이 소스가 아니라 TARGET 컨트롤에서 호출된다는 것입니다. 하지만 나는 그것이 소스에서 (이상적으로 양쪽에서 호출되기를 바랍니다) – xSeder

답변

0

나는이 문제를 다소 잔인하고 안전하지 않은 방법으로 해결했습니다. 그러나 그것이 일시적인 해결책으로 작용할 것입니다.

PageDragStart 이벤트를 발생시킬 때 Mouse.Capture (this, CaptureMode.SubTree)를 호출합니다. 페이지가 어딘가에 떨어질 때 - DoDragDrop은 다른 예외 (COMException, NullReference (어떤 객체가 null인지 찾을 수 없음) 및 일부 기억이 안 나는 다른 예외)를 발생시킵니다. 예외를 catch하고 PageDragEnd 이벤트를 호출합니다 (IsPageDraggingOut 속성을 true로 설정 한 경우).

지금까지이 솔루션이 실제로 더럽고 나쁘다는 것을 알 수 있습니다. 그러나 그것은 효과적이다.

그럼, 다른 아이디어 (또는 Mouse.Capture를 올바르게 사용하는 방법에 대한 아이디어)는 무엇입니까?

1

DoDragDrop을 사용해야하나요? 나는 그 자체로 Mouse.Capture을 사용하여 설명을 읽고 있던 것처럼 확실한 해결책 듯 :

  1. 핸들 OnMouseLeftButtonDown 탭에와 히트 테스트
  2. 핸들을 기반으로 커서를 탭을 포착
  3. 핸들 13. OnMouseMove에서는 시작 및 업데이트 탭에 OnMouseLeftButtonUp 및 캡처를 중지하고 적절한 변화를

을 혹시 간단한 마우스 캡처를 통해 DoDragDrop을 고려해 볼 수 있습니다 이유는 다음과 같습니다

윈도우의 OLE 드래그와 0
  1. 통합 및 드래그와 응용 프로그램 및 기술
  2. (실제로 나에게 단점이 더있을 것으로 보인다) DoDragDrop 호출의 모달 자연
  3. 자동 히트 테스트 사이에 놓을 수 있도록 드롭 의 등

당신은 분명히 OLE 통합 또는 다중 응용 프로그램 지원이 필요하지 않습니다,

  • 표준화 "놓기 작업"API는 관련이없는 응용 프로그램을 이동 대 복사 처리 할 수 ​​있도록 대상으로 당신은 타격을 사용자 정의 할 테스트하기 때문에 DoDragDrop은 마우스 캡처를 직접 처리하는 것보다 이점이 없다는 것을 의미합니다.