对于WPF拖拽问题网上有很多,一般就是一个控件的移动,今天想做一个效果,效果是这样的:
页面分左右两部分,左边是canvas是空的,右边的canvas中有一个矩形,我要把矩形拖到到左侧,拖完后右侧的矩形不消失,也就是说在左边复制了一个矩形,以下是代码
public StackPanel()
{
InitializeComponent();
this.rectImage.PreviewMouseMove += new MouseEventHandler(rect_PreviewMouseMove);
this.Canvas1 .DragOver +=new DragEventHandler(Canvas1_DragOver);
this.Canvas1.Drop += new DragEventHandler(Canvas1_Drop);
}
void rect_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
DataObject data = new DataObject(typeof(Rectangle), this.rectImage);
DragDrop.DoDragDrop(this.rectImage, data, DragDropEffects.Move);
}
}
void Canvas1_DragOver(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(typeof(Rectangle)))
{
e.Effects = DragDropEffects.None;
e.Handled = true;
}
}
void Canvas1_Drop(object sender, DragEventArgs e)
{
IDataObject data =new DataObject ();
data= e.Data;
if (data.GetDataPresent(typeof(Rectangle)))
{
Rectangle rect = new Rectangle();
rect = data.GetData(typeof(Rectangle)) as Rectangle;
this.Canvas2.Children.Remove(rect);
this.Canvas1.Children.Add(rect);
}
}
上面的代码实现的是移动后右侧的矩形就消失了,但是我想不消失,但是把
this.Canvas2.Children.Remove(rect);
这句代码注释了后就会报错,这里该怎么做呢,为什么会出现这个错呢?我刚接触WPF,不明白,高手帮忙
rect = data.GetData(typeof(Rectangle)) as Rectangle;
通过这个方法得到的是你拖拽的那个对象,即
DragDrop.DoDragDrop(this.rectImage, data, DragDropEffects.Move);
传入的data对象。直接添加就会出现逆遇到的错误,因为使用了同一个对象。
创建一个新的Rectangle就可以了。
不过我也没找到好的方法可以实现Rectangle的完全复制,暂时大概只能写成这样了:
if (data.GetDataPresent(typeof(Rectangle)))
{
Rectangle dataobj = data.GetData(typeof(Rectangle)) as Rectangle;
Rectangle rect = new Rectangle();
rect.Height = dataobj.RenderSize.Height;
rect.Width = dataobj.RenderSize.Width;
rect.Fill = dataobj.Fill;
rect.Stroke = dataobj.Stroke;
rect.StrokeThickness = dataobj.StrokeThickness;
this.Canvas1.Children.Add(rect);
rect.SetValue(Canvas.TopProperty, e.GetPosition(Canvas1).Y);
rect.SetValue(Canvas.LeftProperty, e.GetPosition(Canvas1).X);
}
DragDropEffect里的枚举,个人理解就是一种提示作用,不同的值会导致不同的鼠标样式。
DragDrop.DoDragDrop()里的最后一个参数指定了拖放操作的允许效果,对后面设置e.Effect应该是起到限制作用。
DragDropEffects effects = DragDrop.DoDragDrop()调用结束后也可通过判断返回的effects值,即e.Effect的设置值,进行接下来的处理。
先记住右边矩形的位置,然后在Remove之后,在右边原来矩形的位置再复制一个矩形。