2009-06-10 10 views
3

복잡한 팝업 (Canvas Z-index가 99 인 그리드가있는 XBAP ...)을 사용하여 XBAP을 쓰고 있는데, 그 버튼에 "부착"하고 싶습니다. 그것을 열어 화면에 나타나는 모든 곳에서 그 버튼을 따라갑니다. 예를 들어, 버튼이 ListBox 또는 XamDataGrid에있는 경우 팝업이 스크롤되는 동안 버튼을 따라 가야합니다. 익스팬더 아래에 있다면 익스팬더가 움직이게 할 때 버튼에 붙어 있기를 원합니다.다른 컨트롤의 상대 스크린 위치에 팝업 바인딩

어떤 아이디어?

답변

0

자동 업데이트 여부는 잘 모르겠지만 PlacementTarget 속성을 사용하면 팝업을 기준으로 컨트롤을 지정할 수 있습니다. 그래도 작동하지 않는다면 CustomPopupPlacementCallback이 트릭을 수행할까요?

7

Popup을 사용하는 경우 팝업이 원래 나타난 후에 PlacementTarget이나 CustomPopupPlacementCallback이 사용되지 않습니다. 따라서 이러한 속성을 사용하면 팝업이 이동하는 동안 버튼을 추적 할 수 없습니다.

여러 가지 방법으로 당신이 원하는 것을 성취 나에게 발생합니다

  1. 버튼에 사용자 정의 Adorner를 부착하고 그 안에 팝업을 넣어. 단점 : 팝업은 Button 또는 주변 요소에 연결되어 있지 않으므로 속성 & DataContext를 상속하지 않습니다.

  2. 버튼에 맞춤 Adorner을 첨부합니다. 이 adorner는 AdornerLayer을 기준으로 버튼이 움직일 때 측정 및 전화 정렬을 수행하므로 Popup 위치를 수동으로 업데이트 할 수 있습니다. AdornerDecoratorWindow과 관련하여 이동하지 않는 한 (예 : Window의 직계 하위 항목 인 경우) AdornerLayer이 이동되는 것을 Windows 크기의 변경 사항을 모니터링하여 쉽게 감지 할 수 있습니다. 단점 : 복잡한 코드 &이 좋습니다.

  3. Popup을 전혀 사용하지 마십시오. 대신 너비가 0이고 원하는 위치가 0 인 <Grid>의 버튼을 <Canvas>과 함께 포장하십시오. <Canvas> 안에 적절한 ZIndex가있는 팝업에 UserControl을 추가하십시오. 그것은 캔버스의 가장자리를 넘어 확장됩니다. 이것은 WPF에서만 유효합니다. Popup 컨트롤을 사용하는 대신 UserControl의 가시성을 제어하면됩니다. 단점 : 실제로 다른 모든 객체 위에 완전히 올려지지는 않을 것이며, 윈도우 가장자리에서 벗어날 수는 없습니다 (XBAP에서는 문제가되지 않을 수도 있음).