2017-11-22 11 views
0

私のwpfプロジェクトにMVVMを使用しましたが、イベント(Drop、DragOver、DragEnter)をビューモデルに移動します。グリッドでイベントを使用しましたが、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. 
    } 

私が持っている2質問:

(1)私は、グリッド上で何かをドラッグして、メソッドは実行されませんでした。口がボタンの上を移動すると、マウスカーソルは変化しましたが、メソッドは実行されませんでした。何故ですか?

(2)グリッドプロパティを<Grid x:Name="grid" AllowDrop="True" DragEnter="OnGrid_DragEnter">に変更して(Interaction.Triggersを削除する)、ボタン上で何かをドラッグした場合にのみ、イベントがトリガーされます。私はマウスがグリッド内にあることを確かめていますが、ボタンの上にマウスを置いたときは三角だけです。何故ですか?

コードは非常に再現しやすいです、誰も私がこの問題を解決するのを助けてくれることを願っています。

答えて

0

対象物体

それは方法を公開するオブジェクトです。そして、それはGrid "グリッド"ではない、あなたのMainWindowです。だから、x:Name="MyMainWindow"という名前をつけ、TargetObjectのプロパティを変更してください。

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

方法アクセシビリティそれが公共になることがあるので、

OnGrid_DragEnterは、あなたのメイン・ウィンドウクラス内から呼び出されていません。あなたが(それはマウスがButtonの上にあるときにのみトリガー理由です)マウスイベントを追跡することができるようにGridBackgroundプロパティを設定する必要が

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

設定グリッドの背景

。トランスペアレントにする必要がある場合は、Transparentに設定することができます(ただし、グリッドの下に要素があると、その要素がマウスクリックのようなイベントに反応しない理由が不思議に思うかもしれません)。

ドラッグ元の要素が実装する必要がある(XAMLに入れなかった)と仮定すると、OnGrid_DragEnterが実行されます。ドラッグアンドドロップ機能の実装についての詳細が必要な場合は、Microsoft Docsをチェックしてください。

+0

私はあなたの答えで私の問題を解決しました。とても役に立ちます。どうもありがとうございます。 – user7990701

関連する問題