2011-08-06 4 views
0

현재 프로젝트 [Weird scrollbar UI in hosted WPF composite control]에서 해결되지 않은 문제로 인해 해결 방법을 늦춰야했습니다. 한 가지 생각은 ScrollViewer를 Windows Forms ScrollBar (수평 및 수직)와 동기화 상태로 유지하는 것입니다. 그 일을 어떻게 하죠?WPF ScrollViewer와 WinForms ScrollBar 동기화

본질적으로 WinForms 스크롤 막대가 (드래그 및 이벤트와 관련하여) ScrollViewers처럼 작동하도록합니다.

답변

0

WinAPI를 사용하지 않고도 구현할 수있었습니다. 여기에 어떻게 내가 해냈어 :

  1. 는 ScrollViewer에있는 ScrollOffsetChanged 이벤트 핸들러 (이벤트를 노출 IScrollInfo 인터페이스를 구현 한 복합 제어) 등록.
  2. Windows Forms 스크롤바를 사용하여 ValueChanged 이벤트 처리기를 등록합니다.
  3. 이벤트 핸들러에 대한 순환 호출을 방지하기위한 몇 가지 신호 플래그.
  4. 첫 번째 처리기는 Maximium Scrollbar 속성을 계산하는 UpdateExternalScrollBars() 함수를 호출했습니다. ScrollViewer-> ExtentHeight/Width - ScrollViewer-> ViewportHeight/Width. Value 속성은 ScrollViewer-> Vertical/HorizontalOffset으로 직접 설정되었습니다.
  5. 두 번째는 창에서 스크롤 막대를 가져와 ScrolViewer-> ScrollToVertial/HorizontalOffset()에 전달합니다. 신호 플래그는 미리 적절하게 설정되었습니다.
0

나는 lo-level API Windows 메시징을 보내거나 듣는 것 외에 다른 방법이 없다고 생각합니다. Win API에 대한 지식과이를 관리하는 방법을 알고 있어야합니다. 스크롤러는 관리하기가 까다 롭고 복잡한 작업이라고 덧붙이고 싶습니다. 그러나 아마도 그것은 저의 것입니다 ...

여기는 vertical scroll message입니다.

+0

저는 WPF가 Win32/WinForms와는 다른 측정 스케일을 사용하고 있다는 인상하에있었습니다. 그것에 대해 아는 것이 있습니까? – shadeMe

+0

나는 그것이 쉽지 않다고 말하지 않았다. 그러나 ScrollViewer 코드 내부를 들여다 보면 동일한 API가 사용 된 것으로 보입니다. 즉 스크롤바는 최상위 UI에 관계없이 항상 동일해야합니다. –