2009-09-03 6 views
2

사용자 인터페이스가 끔찍하기 때문에 Graph # 라이브러리의 기본 그래프 뷰어를 수정하려고합니다. 경계 밖으로 노드를 드래그 해보십시오!WPF - 드래그 가능한/줌 가능한 자식이있는 패널을 가장 효과적으로 구현하는 방법은 무엇입니까?

기본 설정은 다음과 같습니다. Vertex 및 Edge 컨트롤 유형의 자식을 가진 GraphCanvas 컨트롤 (Panel에서 상속)이 있습니다. 내가 원하는 것은 :

  • 내용이 화면에 맞지 않으면 GraphCanvas에 스크롤 막대가 있습니다.
  • GraphCanvas는 "드래그"(빈 공간을 클릭하고 드래그)하여 스크롤 할 수도 있습니다.
  • GraphCanvas는 (Ctrl + 마우스 휠을 사용하여) 확대 및 축소 할 수 있습니다.
  • 정점을 드래그 할 수 있습니다. 버텍스가 GraphCanvas의 현재 경계 밖으로 드래그되면 경계가 증가합니다. 스크롤 바는 이것을 반영해야하지만, 현재 뷰포트는 버텍스가 드래그되는 동안 스크롤하지 않아야합니다. 버텍스를 드래그하면 GraphCanvas의 경계가 축소됩니다. 드래그 작업이 완료되고 크기가 조정될 때까지 동일한 크기를 유지해야합니다. 드래그하는 동안 뷰포트를 자동으로 스크롤하는 것은 혼란스럽고 드래그 오류가 쉽게 발생합니다. 내 뜻을 알고 싶다면 원래 구현을 참조하십시오.

.NET에서 상당한 경험이 있지만 WPF의 초보자입니다. 내 현재 시도 (측정/정렬 레이아웃 단계에서) 각 vertext에 원하는 경우 (음수 일지라도) 원하는 XY 좌표를 지정하고 GraphCanvas에서 마우스 이벤트를 처리하고 RenderTransform 속성을 수정하여 줌/스크롤을 구현합니다. 끌기 만하면 특정 꼭지점의 XY 좌표가 변경됩니다 (피할 수있는 모든 요소의 재 레이아웃을 유발할 수 있음). 스크롤 막대는 GraphCanvas를 ScrollViewer에 배치하고 GraphCanvas에 IScrollInfo를 구현하여 구현됩니다.

불행히도 문제가있는 것처럼 보입니다. 그 시점에서 배경이있는 경우에만 GraphCanvas 자체에서 마우스 이벤트를 얻을 수 있습니다. 어쨌든 흰색 배경을 원하지만 GraphCanvas의 음수 좌표에서는 배경을 그리지 않아 마우스 이벤트에 응답하지 않습니다.

또한 모든 자식 컨트롤 (정점 및 가장자리)이 음수 좌표로 이동하도록하여 오른쪽 작업을 수행하는지 궁금합니다. 어떻게 구현할 것인가?


추가 : 여기에 표시되는 내용 http://valts.21.lv/problem/GraphCanvas.png

는 간단한 윈도우 폼이 그것에 WPF 호스트 컨트롤 형성 :는 다음의 스크린 샷을 확인 배경 문제에 대해 명확합니다. 거기에는 ScrollViewer가 있고 ScrollViewer에는 GraphCanvas가 있습니다. GraphCanvas는 4 개의 정점과 6 개의 가장자리를 포함합니다.

GraphCanvas가 확장되어 ScrollViewer를 채 웁니다. 그러나 정점 중 일부는 음의 좌표이므로 RenderTransform이 적용되어 모든 것을 오른쪽으로 이동합니다 (TranslateTransform). 흰색 배경 브러시도 있습니다.

왼쪽의 회색 영역에 유의하십시오. 여전히 GraphCanvas의 일부이지만, 백그라운드 브러쉬가 어떻게 든 거기서 나오지 않습니다. 또한 노드 (마우스가 아닌 회색 영역)에서 왼쪽 마우스를 클릭하면 이벤트를 가져옵니다. 흰색 영역을 왼쪽 클릭하면 모든 이벤트가 정상적으로 처리됩니다.

답변

0

마우스를 올리면 캔버스에서의 CaptureMouse과 캔버스에서의 마우스 다운 및 ReleaseMouseCapture으로 전화하십시오. 또한 캔버스 배경을 transparent으로 설정하면 여전히 테스트 할 수 있습니다.

+0

내 질문을주의 깊게 읽으면 왜 이것이 항상 작동하지 않는지 알 수 있습니다 (힌트 : 마지막 두 번째 단락). –

+0

캔버스의 경계를 벗어나서 어떤 마우스 제스처를 수행하려고합니까? –

+0

아마 스크린 샷을 제공 할 수 있습니까? 나는 당신의 단락을주의 깊게 읽었습니다. - 여전히 명확하지 않습니다. –

0

각 요소에 '드래그 가능한'동작을 첨부 할 수 있습니다.