[英]WPF Drag&Drop, DragOver
我想将一个Button从一个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);
}
}
}
}
void StackPanel_DragEnter(object sender, System.Windows.DragEventArgs e)
{
e.Effects = System.Windows.DragDropEffects.Copy;
}
您可以使用此事件并对其进行修改,以便它适用于您的拖放事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.