2015-01-29 34 views
5

Tôi muốn kéo & thả Nút từ một số Stackpanel sang một số khác Stackpanel. Việc triển khai vẫn hoạt động nhưng tôi muốn Nút được gắn vào con trỏ chuột trong Sự kiện kéo dưới dạng Phản hồi trực quan.Kéo và thả WPF, DragOver

Tôi đã tìm kiếm giải pháp cả ngày, nhưng tôi chỉ tìm thấy giải pháp với Canvas chứ không phải với Stackpanels.

Đây là Mã của tôi:

Button.xaml

<UserControl x:Class="LisaBeispiel2.Controls.ImageButton" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Name="IB" 
    AllowDrop="True"> 


<Grid> 
    <Button Margin="3 0 3 3" 
      VerticalAlignment="Top" 
      HorizontalAlignment="Left" 
      IsEnabled="{Binding IsButtonEnabled, ElementName=IB}"> 
     <StackPanel Orientation="Vertical"> 
      <Image Source="{Binding ElementName=IB, Path=Image}" 
        Width="35" 
        Height="35" 
        Margin="8" /> 
      <TextBlock Text="{Binding ElementName=IB, Path=Text}" 
         Foreground="White" 
         FontSize="10" 
         FontFamily="Arial" 
         TextWrapping="Wrap" 
         TextAlignment="Center" /> 
     </StackPanel> 
    </Button> 

</Grid> 

Button.xaml.cs

protected override void OnMouseMove(MouseEventArgs e) 
    { 
     base.OnMouseMove(e); 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      // Package the data into a Dataobject 
      DataObject data = new DataObject(); 

      data.SetData("Object", this); 

      // Inititate the drag-and-drop operation with 3 Parameter: dragSource, data, allowedEffects 
      DragDrop.DoDragDrop(this, data, DragDropEffects.All); 
     } 
    } 

Window .xaml

<StackPanel Orientation="Horizontal" 
       Drop="panel_Drop"> 
    <controls:ImageButton 
    Image="/LisaBeispiel2;component/Images/Icons/Rotate.png" 
    Text="Rotate"/> 
    <controls:ImageButton 
    Image="/LisaBeispiel2;component/Images/Icons/Zoom_Pan.png" 
    Text="Zoom/Pan"/> 
    </StackPanel> 
     <StackPanel Orientation="Horizontal" 
        Drop="panel_Drop"> 
    <controls:ImageButton 
    Image="/LisaBeispiel2;component/Images/Icons/ButtonPlatzhalter.png" 
    Text="Add"/> 
    <controls:ImageButton 
    Image="/LisaBeispiel2;component/Images/Icons/ButtonPlatzhalter.png" 
    Text="Add"/> 
    </StackPanel> 
    </StackPanel> 
    </StackPanel> 

Window.xaml.cs

private void panel_Drop(object sender, DragEventArgs e) 
    { 
     // If an element in the panel has already handled the drop, 
     // the panel should not also handle it. 
     if (e.Handled == false) 
     { 
      Panel _panel = (Panel)sender; 
      UIElement _element = (UIElement)e.Data.GetData("Object"); 

      if (_panel != null && _element != null) 
      { 
       // Get the panel that the element currently belongs to, 
       // then remove it from that panel and add it the Children of 
       // the panel that its been dropped on. 
       Panel _parent = (Panel)VisualTreeHelper.GetParent(_element); 

       if (_parent != null) 
       { 
        _parent.Children.Remove(_element); 
        _panel.Children.Add(_element); 

       } 

      } 
     } 
    } 
+0

Bạn sẽ cần một adorner trên một số phụ huynh container. Bạn có thể đặt một canvas vào adorner đó và nhận được hiệu ứng mà bạn đang theo đuổi. Google này: wpf dragadorner – Brannon

Trả lời

0
void StackPanel_DragEnter(object sender, System.Windows.DragEventArgs e) 
{ 
    e.Effects = System.Windows.DragDropEffects.Copy; 
} 

bạn có thể sử dụng sự kiện này và sửa đổi nó để nó làm việc với các sự kiện thả kéo & của bạn ..