WPF Drag& Drop,DragOver

时间:2015-01-29 10:57:21

标签: c# wpf drag-and-drop

我想将按钮从一个Stackpanel拖放到另一个Stackpanel。该实现仍然有效,但我希望在拖动事件期间将Button作为视觉反馈附加到鼠标光标。

我一整天都在寻找解决方案,但我只找到Canvas而不是Stackpanels的解决方案。

这是我的代码:

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);

                }

            }
        }
    }

1 个答案:

答案 0 :(得分:0)

{{1}}

你可以使用这个事件并对其进行修改,以便它适用于你的拖放活动..