2016-11-26 7 views
0

이상한 버그를 발견했습니다. canvas MouseLeftButtonDown 이벤트에 명령을 바인딩하면 실행되지 않습니다. 나는 디버깅을 시도하고 그것이 발생했다는 것을 알아 차렸지만 초기화 중에 만 나타났습니다. 요점은 구속력이있는 것 같아요.-wpf 캔버스 이벤트 처음으로 만 실행됩니다.

<ItemsControl Grid.Row="1" ItemsSource="{Binding Polygons}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas> 
        <i:Interaction.Behaviors> 
         <behaviours:MouseBehaviour MouseX="{Binding MouseX, Mode=OneWayToSource}" MouseY="{Binding MouseY, Mode=OneWayToSource}" /> 
        </i:Interaction.Behaviors> 

        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseLeftButtonDown"> 
          <command:EventToCommand Command="{Binding SelectPointCommand}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Canvas> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       /* some data template 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

그리고 명령 구현 :

public ICommand SelectPointCommand 
    { 
     get 
     { 
      if (!CanEdit) 
       return new RelayCommand(e => { }); 

      ClickCounter++; 

      if (ClickCounter == 3) 
      { 
       ClickCounter = 0; 
       CanEdit = false; 
      } 

      return new RelayCommand(
       () => 
       { 
        Polygons.Add(new Polygon(ClickedPoints)); 
        ClickedPoints.Clear(); 
       }); 
     } 
    } 

내가 MouseBehaviour에뿐만 아니라 didnt 한 도움이 코드 조각을 삭제 여기에 문제를 추측 여기에 코드입니다.

ps : 캔버스 배경 속성을 설정하려고 시도했지만 작동하지 않았습니다. 뿐만 아니라이 같은 메서드를 호출하려고 이

SelectPointCommand = new RelayCommand(
     () => 
     { 
      System.Windows.MessageBox.Show("Test"); 
     }, 
     () => true); 

편집에 명령을 설정 :

<Canvas Background="Transparent" MouseLeftButtonDown="UIElement_OnMouseLeftButtonDown"> 

</Canvas> 

그리고 뒤에있는 코드 :

private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     ((MainViewModel)DataContext).SelectPointCommand.Execute(e); 
    } 

방법 UIElement_OnMouseLeftButtonDown의 ISN을 ' 어쨌든 호출됩니다. Canvas를 StackPanel로 변경하면 동일한 결과가 나타납니다.

답변

0

자들,이 버그 수정. 문제는 여기에 있습니다 :

<Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto"/> 
</Grid.RowDefinitions> 

행의 높이를 "자동"으로 설정하면 0으로 설정됩니다. 그래서 캔버스는 존재하지 않았습니다! 나는 이런 식으로 왼쪽 :

<RowDefinition/> 

를 모든 것이 잘 작동 후.

0

모든 코드를 게시하지 않으므로 잘못되었는지 확인하기가 어렵습니다. CanEdit 속성이 다른 곳에서 변경 되었습니까? ClickCounter 란 무엇입니까?

문제는 SelectPointCommand의 getter에 있다고 생각합니다. 바인딩을 만드는 순간에 한 번만 실행됩니다. 또한 ICommand의 CanExecute 메소드를 사용하고 getter의 반환 값을 비공개 필드에 저장합니다. 뷰 모델의 생성자에서

private ICommand _selectPointCommand; 
    ICommand SelectPointCommand 
    { 
     get 
     { 
      Console.WriteLine("This is executed once"); 
      return _selectPointCommand; 
     } 

     set 
     { 
      if (_selectPointCommand != value) 
      { 
       _selectPointCommand = value; 
       OnPropertyChanged("SelectPointCommand"); 
      } 
     } 
    } 

: 예

 SelectPointCommand = new RelayCommand(
       (x) => 
       { 
        Console.WriteLine("This is executed every click"); 
        ClickCounter++; 

        if (ClickCounter == 3) 
        { 
         ClickCounter = 0; 
         CanEdit = false; 
        } 
        Polygons.Add(new Polygon(ClickedPoints)); 
        ClickedPoints.Clear(); 
       }, 
       (x) => { return CanEdit; }); 
+0

픽스 업을 시도했지만 불행히도 한 번만 실행됩니다. –