컨셉은 관리하는 지역의 지도가 있고, 지도에 심볼이나 마크 혹은 글자, 이미지 등이 위에 드로잉되게 됩니다.
어느정도 마우스로 Panning과 Dragging을 할 수 있고, 축소 확대가 되게 구현하려고 합니다.(우리가 아는 네이버 지도 같은 기능이 기반으로 있는거죠)
Viewbox를 감싸서 Canvas로 지도를 띄우고 그 위에 각종 심벌, 이미지, 글자 등이 나오고 외부로 부터 메시지를 받으면 해당 심볼이 에니메이션 동작을 하거나 캔버스 위에 메시지 팝업을 하는 거죠.
전체적으로 보면 동작은 간단한데, 제가 제일 궁금한건
위에 말씀드린 이 심볼 오브젝트들을 어떻게 관리할 것이냐에요.
오브젝트를 객체로 만들어서 관리하고 초기 프로그램 로드 시, 외부에서 불러오는데 그냥 Mainwindow.cs에다 다 때려 박고 DB로 저장된 수만큼 쭉 땡겨 오는게 과연 WPF 프로그래밍적인 방법이 맞는지 MVVM의 패턴으로 접근하고 싶어도, 버튼이나 기타 많이 알려진 엘리먼트들의 바인딩과 커멘드 설정이 공개되어있지만, 드로잉 부분은 찾기가 어렵네요. (물론 있지만, 저같은 상황이 아니라 다들 그냥 마우스로 그리고 옮기고 하는정도라서)
어떤식으로 설계를 하는게 좋은 접근인지 조언을 듣고 싶습니다.
단순 이미지를 백그라운드 이미지로 사용하고 Zoom 시스템이 필요하지 않다면 문제는 좀 더 간단해지긴합니다.
화면에 그려질 오브젝트의 상위 컨트롤을 하나 선언하고 그 컨트롤이 렌더링 되는 타이밍에 보관되어 있던 위치 크기 정도를 가져와 적용하는 거죠.
(컨트롤이 위치와 크기 정보를 DP 로 들고 있다가 ViewModel 이 로딩될 때 컨트롤 내부에서 처리해주면 됩니다.)
그렇게 한 뒤 오브젝트의 panning 이나 input에 관련된 처리를 이 상위 컨트롤에서 다 처리하면 되구요.(그러면 외부 의존성이 모두 제거가 되겠지요.)
실제 상위 컨트롤 내부에서 화면에 그려질 자식 내용은 미리 지정해놓은 DataTemplate 을 이용해 적용하는 정도 사용하면 될 거 같습니다.
이 상태에서 Zoom panning 이 들어가면 그냥 background 와 함께 통째로 zoom 처리를 하면 되기 때문에 다른 이슈가 없을 겁니다.
그런데 그게 아니라 타일이미지를 가져와 화면에 뿌리고 zoom level 에 따른 위치 크기 조작이 함께 필요한 경우, 문제가 복잡해 집니다.
이 경우 타일의 위치와 오브젝트의 위치간 동기를 위해 별도의 좌표 체계를 정의해서 사용해야하고(보통은 GIS 좌표계를 따르겠죠?)
각 좌표에 맞게 오브젝트의 변환 처리도 함께 해줘야 합니다. 레이어를 나눠서 처리해도 좌표계에 대한 고려가 필요하구요.
암튼 설계부터 마무리까지 큰 작업이 될 확률이 높아요. 그래서 보통은 잘 만들어진 Map 라이브러리를 가져다 사용하는 게 훨씬 정신건강에 도움이 됩니다.
WPF 상용 Map 라이브러리들은 대부분, 앞에서 설명했던 문제들을 크게 신경쓰지 않고 어디에 뭘 표시할 지만 커스텀하게 조작할 수 있게 되어 있거든요.
별도의 좌표계를 만들 필요 없이 제공해주는 거 쓰면 됩니다. zoom panning 도 대부분 다 지원되기 때문에 직접 만들 일이 거의 없어요.
목표로 하시는 게 실제 Map 서비스와 연동되어야 한다면 직접 전부 만드는 것보다 Map 라이브러리를 사용하는 것을 적극 추천합니다.
답변 정말 감사드립니다.
일단 적절한 라이브러리를 찾기가 힘들더라구요. 혹시 아신다면 추천 부탁드립니다~^^
그리고, 상황에 따라 어떤 맵상의 오브젝트만 이벤트가 발생하고 애니메이션이 나타나고,
해당구역으로 살작 이동 확대 되는 이벤트도 구현하려고 하거든요.
또한, 오브젝트를 백그라운드화 시키면 마우스 클릭이벤트 같은 컨트롤이 어려워 지지 않을까하는 걱정이 드네요.(제가 잘 몰라서 이런 생각을 할 수도 있습니다.) 보통 오브젝트를 캔버스 트리 하위로 갖고 있으면, 자식 트리의 bubble? 형식의 이벤트 접근해서 좌표나 인스턴스를 찾을 수 있는거 같더라구요.
현재 기존에 개발하시던 분이 주석을 없이 나가셔서, (해당프로그램이 WPF MVVM Caliburn기반 visitor pattern 뭐 이런거로 짜놓으시고 인수인계 없이 가셨습니다…) 정신적으로 상당히 피폐하네요.
찾기 힘들다고 하신 건 대상이 무료라서 그런 건지는 모르겠지만 유료 라이브러리들 좋은 거 많아요.
제가 영업하는 건 적절하지 않고…ㅋㅅㅋ
Tele…, Infra…, Syn…, Comp…, DevE… 얘네도 Map 지원 하구요. Map 전용 라이브러리도 꽤 있어요(Arc…, Bin…, G… 등등)
찾으면 많이 나올겁니다.
다만 유료라는 거…~ㅂ~