2011-02-16 7 views
2

표준 WPF ComboBox처럼 보이는 사용자 지정 컨트롤을 만들고 싶습니다. 팝업 대신 ItemsPresenter 대신에 다른 사용자 지정 컨트롤이 있습니다. 따라서 System.Windows.Controls.Control에서 파생 된 새 클래스를 만들고 IsDropDownOpen 속성을 추가하고 실제로 ComboBox 스타일의 복사본 인 스타일을 만들었습니다 (기본 아이디어는 Popup.IsOpenToggleButton.IsPressed 속성이 컨트롤의 IsDropDownOpen 속성에 바인딩 됨).WPF 콤보 상자 형 사용자 지정 컨트롤

컨트롤 외부를 클릭 할 때 Popup이 닫히지 않는 것이 문제입니다.

나는 반사경의 ComboBox 클래스에서 확인해 보니 ComboBox이 마우스 캡처를 잃을 때 IsDropDownOpen 속성을 업데이트 할 몇 가지 논리를 사용하는 것을 알아 냈다. 그러나이 코드는 내부 클래스를 사용합니다. 사용자가 컨트롤 외부를 클릭하고 Popup을 닫는 지 확인하는 다른 방법이 있습니까?

UPD : 나는 게시 할 파일을 첨부 할 수있는 방법을 찾을 수 없었기 때문에이 샘플 프로젝트 here

이 콤보 상자처럼 보이는 사용자 정의 컨트롤이지만 팝업에서 트 리뷰가 있습니다을 업로드했습니다. 팝업을 열고 컨트롤 바깥을 클릭하면 자동으로 닫히지 만 팝업을 열면 'Item2'를 확장 한 다음 팝업 바깥 쪽을 클릭하면 닫히지 않습니다. 문제는이를 해결하는 방법입니다.

+0

당신이 몇 가지 코드를 게시 할 수 있습니까? – RQDQ

+0

@RQDQ : 정확히 무엇이 필요합니까? 제어 템플릿? 내가 말했듯이 기본 콤보 박스 템플릿과 동일하지만 ItemsPresenter 대신 다른 컨트롤이 있습니다. – adogg

+0

아이디어는 이미 가지고있는 것을보고 싶습니다. 그래서 우리는 단지 당신을 돕기 위해 바퀴를 재발 명할 필요가 없습니다. – RQDQ

답변

0

이 코드는 문제를 해결합니다. 정적 생성자에서

:

EventManager.RegisterClassHandler(typeof(CustomComboBox), Mouse.LostMouseCaptureEvent, new MouseEventHandler(OnMouseCaptureLost)); 

이벤트 핸들러 구현 :

private void OnMouseCaptureLost(object sender, MouseEventArgs e) 
{ 
    if (Mouse.Captured != _container) 
    { 
     if (e.OriginalSource != _container) 
     { 
     Mouse.Capture(_container, CaptureMode.SubTree); 
     e.Handled = true; 
     } 
    } 
} 
+0

'_container'의 의미와 작동에 필요한 모든 단계는 무엇인지 설명 할 수 있습니까? –

+0

링크 된 파일이 더 이상 존재하지 않습니다. –

0

Control.LostFocus 이벤트가 있습니다.이를 처리하는 데 충분할 수도 있습니다.

+0

팝업이 표시되고 외부에서 클릭하면이 이벤트가 발생하지 않습니다. – adogg