2016-04-18 10 views
0

ドラッグ可能なアイテムをドラッグしているときにマウスポインタの後にポップアップを作成しようとしています。WPF DragDrop.GiveFeedbackが連続的に起動しない

次つむは、マウスポインタでポップアップを開きますが、私は私がポップアップ位置を更新できるようにするGiveFeedbackデリゲートに依存している(ポインタが移動する場合には、ある)

private void Members_DragOver(object sender, DragEventArgs e) 
{ 
    dragPopup.DataContext = DraggedItem; 
    var mousePoint = Mouse.GetPosition(this); 
    dragPopup.HorizontalOffset = mousePoint.X + this.Left + 10; 
    dragPopup.VerticalOffset = mousePoint.Y + this.Top + 10; 
    dragPopup.IsOpen = true; 
} 

private void Members_GiveFeedback(object sender, GiveFeedbackEventArgs e) 
{ 
    if (dragPopup.IsOpen) 
    { 
     var mousePoint = Mouse.GetPosition(this); 
     dragPopup.HorizontalOffset = mousePoint.X + this.Left + 10; 
     dragPopup.VerticalOffset = mousePoint.Y + this.Top + 10; 
     dragPopup.IsOpen = true; 
    } 
} 

、ポップアップ自体私の窓のメイングリッドに住んでいた。

NOTE

私はMouseMovePreviewMouseMove時の位置を取り扱う試してみたが、これらのイベントは、ドラッグアンドドロップ手順の間に完全に無視されます。

<Popup x:Name="dragPopup" Placement="MousePoint"> 
    <Border BorderThickness="2" Background="White" DataContext="{Binding}"> 
     <StackPanel Orientation="Horizontal" Margin="4,3,8,3"> 
      <TextBlock Text="{Binding FullName}" FontWeight="Bold" VerticalAlignment="Center" Margin="8,0,0,0" /> 
     </StackPanel> 
    </Border> 
</Popup> 

GiveFeedbackデリゲート火災回だけ(5つの確認本のhitcounterでブレークポイントを設定します)。 this MSDN articleさんのコメント:

このイベントは、ドラッグアンドドロップ操作中に引き続き発生します。したがって、イベントハンドラではリソースを大量に消費するタスクを避ける必要があります。たとえば、GiveFeedbackイベントが発生するたびに新しいカーソルを作成する代わりに、キャッシュされたカーソルを使用します。

なぜデリゲートは1回だけ起動されますか?

答えて

1

あなたは正しいです、GiveFeedBackはそれを行う方法です。私はドラッグ中にGiveFeedBackを呼び出すことができました。明らかに、GiveFeedBackのマウスの位置は、マウスの移動とは異なるように扱われます。私はWinFormsマウスの位置を使用してこれを修正することができます。以下のコードのための基準のSystem.Windows.Formsを追加しSystem.Drawing:
XAML:

 <Grid GiveFeedback="Members_GiveFeedback"> 
       <Popup x:Name="dragPopup" Placement="MousePoint"> 
        <Border BorderThickness="2" Background="White" DataContext="{Binding}"> 
         <StackPanel Orientation="Horizontal" Margin="4,3,8,3"> 
          <TextBlock Text="Test" FontWeight="Bold" VerticalAlignment="Center" Margin="8,0,0,0" /> 
         </StackPanel> 
        </Border> 
       </Popup> 
       <StackPanel Orientation="Horizontal"> 
        <ListBox x:Name="sourcList" Height="50" 
        PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown" 
        PreviewMouseMove="sourcList_PreviewMouseMove" 
        AllowDrop="True" > 
         <ListBoxItem > source Item #1</ListBoxItem> 
       </ListBox> 

       <ListBox x:Name="droplist" Height="50" AllowDrop="True" Drop="droplist_Drop" > 
         <ListBoxItem >dest Item #2</ListBoxItem> 
        </ListBox> 
       </StackPanel> 
      </Grid> 

    private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
      { 
       var mousePoint = Mouse.GetPosition(this); 
       startPoint=mousePoint; 

       var point = GetMousePositionWindowsForms(); 
       var formsmousePoint = new Point(point.X, point.Y); 
       var pointfromscreen = dragPopup.PointFromScreen(formsmousePoint); 
       dragPopup.HorizontalOffset = pointfromscreen.X - 100; 
       dragPopup.VerticalOffset = pointfromscreen.Y - 100; 
       dragPopup.IsOpen = true; 
      } 

      private void sourcList_PreviewMouseMove(object sender, MouseEventArgs e) 
     { 
      ...     
     } 

    private void droplist_Drop(object sender, DragEventArgs e) 
     { 

      ... 

     } 

    private void Members_GiveFeedback(object sender, GiveFeedbackEventArgs e) 
     { 
      if (dragPopup.IsOpen) 
      { 
       var point=GetMousePositionWindowsForms(); 
       var mousePoint = new Point(point.X, point.Y); 
       var pointfromscreen=dragPopup.PointFromScreen(mousePoint); 
       dragPopup.HorizontalOffset = pointfromscreen.X-100; 
       dragPopup.VerticalOffset = pointfromscreen.Y-100; 
      } 
     } 

     public static Point GetMousePositionWindowsForms() 
     { 
      System.Drawing.Point point = System.Windows.Forms.Control.MousePosition; 
      return new Point(point.X, point.Y); 
     } 
+0

それは、ちょっと微調整して、私が望むように設定しました。ありがとう! – DerpyNerd

1

私は次の操作を行って、私のマウス、次のあなたのポップアップを得た:XAML側のその後

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    var mousePoint = Mouse.GetPosition(this); 
    dragPopup.HorizontalOffset = mousePoint.X + this.Left + 10; 
    dragPopup.VerticalOffset = mousePoint.Y + this.Top + 10; 
    dragPopup.IsOpen = true; 
} 

private void Grid_MouseMove(object sender, MouseEventArgs e) 
{ 
    var mousePoint = Mouse.GetPosition(this); 
    dragPopup.HorizontalOffset = mousePoint.X + this.Left + 10; 
    dragPopup.VerticalOffset = mousePoint.Y + this.Top + 10;  
} 

<Grid MouseMove="Grid_MouseMove"> 
    ... 
    <ListBox Height="50" PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown" AllowDrop="True"> 
     <ListBoxItem> ListBox Item #1</ListBoxItem> 
    </ListBox> 

位置は、しかし少しオフになっています。

+0

位置mousePoint.X + this.Left + 10 ''であるため+ 10の10でオフであるべきですそれはあなたが見ているものですか?私はこれを試してみます – DerpyNerd

+0

あまりにも悪いです。 'DoDragDrop'が開始された後、' MouseMove'は起動されません。どうやらドラッグは動いているマウスのようなものではありません。ポップアップはマウスに追従せず、ドラッグを開始したときにポップアップを離した場所にとどまります。 – DerpyNerd

関連する問題