lsirikh / ProperyExplorerTest

에로로님의 예제를 구현 및 응용해보자
0 stars 0 forks source link

DataTemplate 안에 StackPanel을 넣는 것과는 상관없어 보입니다. 제어 주체가 누구냐가 더 중요하죠. #5

Open lsirikh opened 2 years ago

lsirikh commented 2 years ago

DataTemplate 안에 StackPanel을 넣는 것과는 상관없어 보입니다. 제어 주체가 누구냐가 더 중요하죠.

ListBox 를 생각해볼까요? ListBox 는 selection에 관한 @lsirikh 님이 의도한 동작을 모두 할 수 있죠?(panning 을 제외하고) selection 동작을 생각해보세요. item 을 선택했을 때 선택된 item 스스로 자기가 선택되었다고 뭔가 하나요? (binding 처리를 한다든지 command 를 실행한다든지... 등등) 그냥 ListBox 의 SelectedItem 에서 처리될 거예요. item 스스로는 뭔가 하는 게 없어요.

이게 힌트가 되지 않을까 싶네요.

Originally posted by @shwlee in https://github.com/lsirikh/ProperyExplorerTest/issues/4#issuecomment-931800973

전 MapEditor를 만드는건데요. 우선 Adorner를 나중에 그위에 이용해보려고해요.. 가능하면...

그리고 맵은 시중에 있는 네이버 지도나 구글 지도가 아니라 해당 구역의 도면, 보안구역 지도 혹은 3D 형태의 이미지일 수 있습니다.

그래서 이미지 백그라운드 위에 그냥 아이콘 이미지나 그룹화된 이미지 모임 등을 올려놓고 어떤 신호를 외부에서 받으면 그게 깜빡거리거나 애니메이션 효과를 발현하게 만드려고 하거든요... (이건 나중에 관제용 프로그램에서 적용예정이지만...)

그래서 맵에디터는 다양한 맵 상의 오브젝트들을 옮기고 바꾸고 하는 기능이 필요해서 멀티 셀렉팅하고 통째로 드래그해서 옮기고 하는 기능이 필요한거고요. 그러다 보니 멀티셀렉팅될때 PropertyExplorer는 안나타나야되는데 어떻게 해야되나 싶기도 하고요..ㅎㅎ 멀티셀렉팅하고 드래깅하면 지금 thumb class의 컨트롤로 가능한지도 궁금하고요. 다 구현하려면 진짜 오래걸릴거 같아서 걱정입니다..ㅠㅠ

혹시 카페에 그전에 올려주신 사각형 움직이는 프로젝트 있잖아요? Behavior를 이용하면 지금보다 더 이용하는 방법이 수월할까요?

shwlee commented 2 years ago

뭐 현실적으로 보자면 지금 여기에서 하는 건 그냥 연습이라고 생각하시는 게 맞을 거 같아요 현업 솔루션에서는 그냥 Map 라이브러리 하나 사용하면 끝나는 일입니다. (물론 그건 그 때 가서 또 다른 고민이 있겠지만...-ㅂ-)

단순히 Canvas의 위치를 조작하는 동작이라면 미니멀님의 방식이 가장 간단하지만 이게 다른 mouse 액션과 맞물리면... 사실 제대로 동작 안 한다고 봐야해요. Thumb 이나 Button 등등의 것들을 사용하면 mouse down 시 스스로 capture 하고 이벤트의 e.Handled 를 내부적으로 true 로 설정하기 때문에 연결된 다른 액션들이 제대로 동작하지 않을 겁니다. 제 기억으로는 그래서 behavior 를 사용하거나 다른 방식으로 했던 거 같은데

이 부분은 좀 더 공부해 보시고 결론을 내리는 게 좋지 않을까 합니닷! 화이팅!

lsirikh commented 2 years ago

넵넵 알겠습니다. 아무래도 입혀서 사용하고 behavior를 심어 넣어서 사용해야될 것 같습니다. 예전에 올려주신 프로젝트를 제가 난도질하면서 테스트 해봤는데요. 그게 제일 좋은거 같아요... 제 생각이 맞을 까요? 다시 수정하고 PR하겠습니다.

lsirikh commented 2 years ago

<i:Interaction.Behaviors> <behavior:InCanvasMovingBehavior /> </i:Interaction.Behaviors>

이 코드가 어디에 들어가야지 작동이 될까요? ㅎㅎ...ㅠㅠ 어떻게 연결되고 어떻겨 관련지어지는 모르니까 어디다 둬야될지 모르겠네요..ㅠㅠ

shwlee commented 2 years ago

지금 요 PR 코드에서는 Interaction.Behaviors 를 사용하지 않습니다. InCanvasMovingBehavior 기능을 제공하기 위한 AttachedProperty 호스트로 사용하고 있어요. 개념적으로는 간단한데 억지로 뭔가 마우스 관련 동작을 뚫어보려고 시도한 거라 좀 복잡해 보일 수는 있겠군요...

천천히 보세욜~ㅂ~

lsirikh commented 2 years ago

<DataTemplate DataType="{x:Type shapes:RectViewModel}"> <Thumb Style="{StaticResource ThumbStyle}"> <Thumb.Template> <ControlTemplate> <Grid> // 중략... </Grid> </ControlTemplate> </Thumb.Template> <i:Interaction.Behaviors> <control:InCanvasMovingBehavior /> </i:Interaction.Behaviors> </Thumb> </DataTemplate> 이렇게 넣으니까 BreakPoint로 걸리긴 걸리는데, 그런데 이상하게 마우스 오른쪽 버튼이랑 휠버튼 클릭할때만 넘어가고 왼쪽마우스 버튼을 클릭하면 신호를 못받네요.

음.... 왜 Canvas.Left와 Canvas.Top은 NAN로 계속 나올까요? 102, 34 인데 실제로는...

아무래도 var (left, top) = this.GetElementPosition(element);
(InCanvasMovingBehavior에 private void AssociatedObjectOnMouseDown(object sender, MouseButtonEventArgs e) )

함수 전문 private void AssociatedObjectOnMouseDown(object sender, MouseButtonEventArgs e) { this._isCaptured = true;

var element = AssociatedObject; this._originPoint = e.GetPosition(this._parent);

Debug.WriteLine($"[shwlee] ~~~~~~~~~~~~~~~~~ {this._originPoint}");

var (left, top) = this.GetElementPosition(element); this._originPoint.X -= left; this._originPoint.Y -= top;

element.CaptureMouse(); }

이게 작동하지 않는 것 같습니다.

shwlee commented 2 years ago

뭔가 서로 다른 걸 보고 있는 느낌인데요? 혹시 제 PR 이 안 보이시나요?

안 보이시면 codeReview_component 브랜치를 받아서 살펴보세욜 'ㅁ'

lsirikh commented 2 years ago

앗... 확인해보겠습니다.

감사합니다.