首页 新闻 会员 周边

WPF拖拽实现

1
悬赏园豆:10 [已解决问题] 解决于 2010-09-02 09:55

对于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,不明白,高手帮忙

蝶殇的主页 蝶殇 | 初学一级 | 园豆:32
提问于:2010-08-17 15:22
< >
分享
最佳答案
1

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的设置值,进行接下来的处理。

收获园豆:10
peony007 | 菜鸟二级 |园豆:397 | 2010-08-23 17:20
其他回答(1)
0

先记住右边矩形的位置,然后在Remove之后,在右边原来矩形的位置再复制一个矩形。

麒麟.NET | 园豆:3614 (老鸟四级) | 2010-08-17 16:25
您好,我想问一下,WPF默认的DragDrop类不能实现这样的吗?还有所谓的DragDropEffect里的枚举又有什么用呢?应该是有关联的吧
支持(0) 反对(0) 蝶殇 | 园豆:32 (初学一级) | 2010-08-17 16:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册