Open lsirikh opened 2 years ago
뭐 현실적으로 보자면 지금 여기에서 하는 건 그냥 연습이라고 생각하시는 게 맞을 거 같아요 현업 솔루션에서는 그냥 Map 라이브러리 하나 사용하면 끝나는 일입니다. (물론 그건 그 때 가서 또 다른 고민이 있겠지만...-ㅂ-)
단순히 Canvas의 위치를 조작하는 동작이라면 미니멀님의 방식이 가장 간단하지만 이게 다른 mouse 액션과 맞물리면... 사실 제대로 동작 안 한다고 봐야해요. Thumb 이나 Button 등등의 것들을 사용하면 mouse down 시 스스로 capture 하고 이벤트의 e.Handled 를 내부적으로 true 로 설정하기 때문에 연결된 다른 액션들이 제대로 동작하지 않을 겁니다. 제 기억으로는 그래서 behavior 를 사용하거나 다른 방식으로 했던 거 같은데
이 부분은 좀 더 공부해 보시고 결론을 내리는 게 좋지 않을까 합니닷! 화이팅!
넵넵 알겠습니다.
아무래도
<i:Interaction.Behaviors>
<behavior:InCanvasMovingBehavior />
</i:Interaction.Behaviors>
이 코드가 어디에 들어가야지 작동이 될까요? ㅎㅎ...ㅠㅠ 어떻게 연결되고 어떻겨 관련지어지는 모르니까 어디다 둬야될지 모르겠네요..ㅠㅠ
지금 요 PR 코드에서는 Interaction.Behaviors
를 사용하지 않습니다.
InCanvasMovingBehavior 기능을 제공하기 위한 AttachedProperty 호스트로 사용하고 있어요.
개념적으로는 간단한데 억지로 뭔가 마우스 관련 동작을 뚫어보려고 시도한 거라 좀 복잡해 보일 수는 있겠군요...
천천히 보세욜~ㅂ~
<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();
}
이게 작동하지 않는 것 같습니다.
뭔가 서로 다른 걸 보고 있는 느낌인데요? 혹시 제 PR 이 안 보이시나요?
안 보이시면 codeReview_component 브랜치를 받아서 살펴보세욜 'ㅁ'
앗... 확인해보겠습니다.
감사합니다.
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