2017-11-22 4 views
0

내 wpf 프로젝트에 MVVM을 사용하고 이벤트 (Drop, DragOver, DragEnter)를 내 viewmodel로 이동하려고합니다. 표에서 이벤트를 사용했지만 TargetObject 또는 기타 속성을 설정하는 방법에 관계없이 메서드가 실행되지 않습니다. 그러나 상황을 재현 할 또 다른 프로젝트를 만들었습니다. 여기 코드입니다 :Drop, DragOver, DragEnter 이벤트에서 WPF CallMethodAction이 작동하지 않습니다.

XAML

<Window x:Class="WpfApplication2.MainWindow" 
        . 
        . 
        . 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid x:Name="grid" AllowDrop="True" > 
     <Button x:Name="button" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="110,57,0,0"/> 
     <i:Interaction.Triggers> 
      <!--<i:EventTrigger EventName="Drop"> 
       <ie:CallMethodAction MethodName="OnGrid_Drop" TargetObject="{Binding}" /> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="DragOver"> 
       <ie:CallMethodAction MethodName="OnGrid_DragOver" TargetObject="{Binding }" /> 
      </i:EventTrigger>--> 
      <i:EventTrigger EventName="DragEnter"> 
       <ie:CallMethodAction MethodName="OnGrid_DragEnter" TargetObject="{Binding ElementName=grid}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Grid> 
</Window> 

코드 숨김

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      AllocConsole(); 
     } 

     private void OnGrid_Drop(object sender, DragEventArgs e) 
     { 
      Console.WriteLine("00000");   
     } 
     private void OnGrid_DragEnter(object sender, DragEventArgs e) 
     { 
      Console.WriteLine("11111");  
     } 
     private void OnGrid_DragOver(object sender, DragEventArgs e) 
     { 
      Console.WriteLine("22222");   
     } 

     ...... //The code in here is to make the console pop up. 
    } 

내가 가진 두 개의 질문 :

(1) 내가 그리드를 통해 뭔가를 드래그 메소드가 실행되지 않았습니다. 버튼 위로 마우스를 움직이면 마우스 커서가 변경되었지만 메서드가 실행되지 않았습니다. 왜 그런가요?

(2) 그리드 속성을 <Grid x:Name="grid" AllowDrop="True" DragEnter="OnGrid_DragEnter">으로 변경하고 (Interaction.Triggers를 삭제하는 경우) 버튼에 무엇인가 드래그 할 때만 이벤트가 트리거됩니다. 내 마우스가 그리드에 있음을 확신하지만 버튼 위에 마우스를 올려 놓을 때만 trig. 왜 그런가요?

코드는 매우 쉽게 재현 할 수 있으며이 문제를 해결하는 데 도움이 될 수 있기를 바랍니다.

답변

0

TargetObject는

이 방법을 노출시키는 것을 목적으로한다. 그리고 그것은 "grid"라는 Grid이 아니며, 귀하의 MainWindow입니다. 따라서 이름을 x:Name="MyMainWindow"으로하고 TargetObject 속성을 변경하십시오.

<i:EventTrigger EventName="DragEnter"> 
    <ie:CallMethodAction MethodName="OnGrid_DragEnter" // 
         TargetObject="{Binding ElementName=MyMainWindow}" /> 
</i:EventTrigger> 

방법 접근성이 공개되고있다 있도록

OnGrid_DragEnter이, 당신의 MainWindow를 클래스 내에서 호출되지 않습니다.

public partial class MainWindow : Window 
{ 
    .... 
    public void OnGrid_DragEnter(object sender, DragEventArgs e) 
    { 
     Console.WriteLine("11111");   
    } 
    .... 
} 

설정 그리드의 배경

있습니다 (마우스가 Button 위에있을 때 그것은 단지 트리거 이유이다) 마우스 이벤트를 추적 할 수 있도록 GridBackground 속성을 설정해야합니다. 투명해야하는 경우에는 Transparent으로 설정할 수 있습니다 (나중에 눈금 아래에 요소가있는 경우 마우스 클릭과 같은 이벤트에 해당 요소가 반응하지 않는 이유를 궁금해 할 수 있습니다.)

끌기 소스 요소가 필요한 것을 구현한다고 가정하면 (사용자가 XAML에 넣지 않은 경우) OnGrid_DragEnter이 실행됩니다. 끌어서 놓기 기능 구현에 대한 자세한 내용은 Microsoft Docs을 확인하십시오.

+0

답변으로 내 문제를 해결했습니다. 매우 도움이됩니다. 정말 고맙습니다. – user7990701