在做WPF程序时通过WindowsFormsHost嵌入了一个WinForm控件。现在想实现从WPF控件中拖放数据到WinForm控件,但是在WinForm控件的DragDrop里无法获取到数据(数据为自定义对象,若为string是可以的)。
下面是自己做的一个Demo,当拖放椭圆(wpf控件)到Label(winform控件)时,将会弹出"拖放数据无效"的对话框
后台逻辑:private void ellipse1_MouseMove(object sender, MouseEventArgs e)
        {
            DataObject data = new DataObject(System.Windows.Forms.DataFormats.FileDrop, new Test());
            DragDrop.DoDragDrop(ellipse1, data, DragDropEffects.Move);
        }        private void Label_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if (!e.Data.GetDataPresent(System.Windows.Forms.DataFormats.FileDrop))
            {
                MessageBox.Show("没数据");
                return;
            }            var data = e.Data.GetData(System.Windows.Forms.DataFormats.FileDrop);
            if (data != null)
            {
                MessageBox.Show(data.ToString());
            }
            else
            {
                MessageBox.Show("拖放数据无效");
            }
        }        private void Label_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect = System.Windows.Forms.DragDropEffects.Move;
        }
    }    [Serializable]
    public class Test
    {
        public override string ToString()
        {
            return "Test数据";
        }
    }
界面XAML:<Grid>
        <WindowsFormsHost Height="100" HorizontalAlignment="Left" Margin="10,10,0,0" Name="windowsFormsHost1" VerticalAlignment="Top" Width="200" Background="Azure">
            <winform:Label DragEnter="Label_DragEnter" DragDrop="Label_DragDrop" Text="Hello" AllowDrop="True"></winform:Label>
        </WindowsFormsHost>
        <Ellipse Height="100" Stroke="AliceBlue" StrokeThickness="50" HorizontalAlignment="Left" Margin="10,120,0,0" Name="ellipse1" VerticalAlignment="Top" Width="200" MouseMove="ellipse1_MouseMove" />
    </Grid>

解决方案 »

  1.   

    来几个Mark的也好呀,难道这个问题不具备回答的价值???
      

  2.   

    还真没有这么用过   为什么引用WinForm中的Label控件啊  直接用WPF的Label控件不可以吗?
      

  3.   


    那个只是个Demo,随便用了几个控件,实际项目中需要在WPF中使用WinForm控件,并且需要拖动WPF控件到WinForm控件中实现拖放
      

  4.   

    在DoDragDrop()之前,设置一下数据的类型及具体的数据:
    data.SetData(typeof(Test), o);
      

  5.   

    感谢感谢,之前一直想着用string来作为数据获取的key,现在改为用type就可以了
    private void ellipse1_MouseMove(object sender, MouseEventArgs e)
            {
                //var o = new Test();
                DataObject data = new DataObject(typeof(Test), new Test());
                //data.SetData(typeof(Test), o);            DragDrop.DoDragDrop(ellipse1, data, DragDropEffects.Move);
            }        private void Label_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
            {
                if (!e.Data.GetDataPresent(typeof(Test)))
                {
                    MessageBox.Show("没数据");
                    return;
                }            var data = e.Data.GetData(typeof(Test));
                if (data != null)
                {
                    MessageBox.Show(data.ToString());
                }
                else
                {
                    MessageBox.Show("拖放数据无效");
                }
            }        private void Label_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
            {
                e.Effect = System.Windows.Forms.DragDropEffects.Move;
            }