2017-11-23 8 views
2

Im은 아직 MVVM에 익숙하지 않지만 그것을 배우려고합니다.코드를 MouseButtonEventArgs에서 MVVM으로 변환하십시오.

그려진 사각형을 내 캔버스에 맞게 크기를 조정해야합니다. 하지만 MVVM 방식으로하고 싶습니다.

는이 게시물과 작업을 발견하고는 내 요구를 스위트 룸하지만이

https://denisvuyka.wordpress.com/2007/10/15/wpf-simple-adorner-usage-with-drag-and-resize-operations/

는 내가 DevExpress의 MVVM을 사용하고 MVVM

// Handler for element selection on the canvas providing resizing adorner 
     void myCanvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      // Remove selection on clicking anywhere the window 
      if (selected) 
      { 
       selected = false; 
       if (selectedElement != null) 
       { 
        // Remove the adorner from the selected element 
        aLayer.Remove(aLayer.GetAdorners(selectedElement)[0]);      
        selectedElement = null; 
       } 
      } 

      // If any element except canvas is clicked, 
      // assign the selected element and add the adorner 
      if (e.Source != myCanvas) 
      { 
       _isDown = true; 
       _startPoint = e.GetPosition(myCanvas); 

       selectedElement = e.Source as UIElement; 

       _originalLeft = Canvas.GetLeft(selectedElement); 
       _originalTop = Canvas.GetTop(selectedElement); 

       aLayer = AdornerLayer.GetAdornerLayer(selectedElement); 
       aLayer.Add(new ResizingAdorner(selectedElement)); 
       selected = true; 
       e.Handled = true; 
      } 
     } 

를이 코드를 변환하려고 MVVM하지

그리고 내 xaml 코드

<Canvas Name="myCanvas" Background="Gray"> 
     <dxmvvm:Interaction.Behaviors> 
      <dxmvvm:EventToCommand Command="{Binding OnSelectedCommand , Source={x:Static vm:Vm.instance}}" 
             EventName="MouseDown" CommandParameter="{Binding ElementName=myCanvas}" 
             PassEventArgsToCommand="True"> 
      </dxmvvm:EventToCommand> 
     </dxmvvm:Interaction.Behaviors> 
</Canvas > 

캔버스를 내 뷰 모델에 전달하려고합니다.

이 현재 나의 코드가 작동하지 않습니다 내 뷰 모델

public DelegateCommand<Canvas> OnSelectedCommand { get; private set; } 
     public Vm() 
     { 
      OnSelectedCommand = new DelegateCommand<Canvas>(OnSelectedEvent, true); 
     } 
     Canvas c = new Canvas(); 
     private void OnSelectedEvent(object e) 
     { 
      if (e == null) return; 
      c = e as Canvas; 

      // Remove selection on clicking anywhere the window 
      if (selected) 
      { 
       selected = false; 
       if (selectedElement != null) 
       { 
        // Remove the adorner from the selected element 
        aLayer.Remove(aLayer.GetAdorners(selectedElement)[0]); 
        selectedElement = null; 
       } 
      } 

      // If any element except canvas is clicked, 
      // assign the selected element and add the adorner 
      if (e.Source != myCanvas) 
      { 
       _isDown = true; 
       _startPoint = e.GetPosition(myCanvas); 

       selectedElement = e.Source as UIElement; 

       _originalLeft = Canvas.GetLeft(selectedElement); 
       _originalTop = Canvas.GetTop(selectedElement); 

       aLayer = AdornerLayer.GetAdornerLayer(selectedElement); 
       aLayer.Add(new ResizingAdorner(selectedElement)); 
       selected = true; 
       e.Handled = true; 
      } 
     } 

코드입니다. 뒤에있는 코드에서 나는 방법에 필요한 MouseButtonEventArgs 있습니다.

내가 직면 한 문제는 어떻게 MouseButtonEventArgs에 액세스합니까?

블로그의 샘플 코드를 사용할 수 없습니다.

답변

2

행동을 사용하여 목표를 구현할 수 있습니다.

첫째, 프로젝트에 다음 두 어셈블리 참조를 추가 :

System.Windows.Interactivity.dll

Microsoft.Expression.Interactions.dll

다음 XAML을 추가 네임 스페이스 :

xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

n은이 같은 캔버스 제어를위한 동작을 추가 :

<Canvas> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="PreviewMouseLeftButtonDown"> 
       <ei:CallMethodAction MethodName="OnLeftButtonClicked" TargetObject="{Binding}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     ... 
    </Canvas> 

EventTrigger는 특정 이벤트가 발생을 수신하는 트리거 동작입니다. CallMethodActionTargetObjectMethodName 속성으로 지정되는 메서드를 호출하는 작업입니다. 여기에서 TargetObject의 값은 {Binding}입니다. 이는 대상 개체가보기 모델임을 의미하므로보기 모델에서 이러한 이름의 메서드를 호출합니다.

그런 다음 뷰 모델에서, 다음과 같은 방법을 추가

public void OnLeftButtonClicked(object s,MouseButtonEventArgs e) 
    { 

    } 

주의 사항 :

  1. 개질제 public해야한다;

  2. 메서드 이름은 MethodName 속성과 동일해야합니다. CallMethodAction;

+0

감사합니다. 하지만 위의 코드로. 내 뷰 모델에 캔버스를 어떻게 전달할 수 있습니까? –

+0

's'을 Canvas로 변환 :'var canvas = s as Canvas' – WPInfo

+0

정말 고마워요. 그것은 정말로 나를 도왔다. 나는 5 시간 동안 해결책을 찾고 있었다. 후속 질문 : –