Tôi đang cố gắng kéo dữ liệu từ phần Winforms của ứng dụng trên một điều khiển WPF được chứa bên trong một "ElementHost". Và nó đổ vỡ khi tôi cố gắng làm như vậy.WinForms Interop, Kéo và Thả từ WinForms -> WPF
Hãy thử điều tương tự nhưng từ Winforms đến Winforms hoạt động tốt. (Xem mã ví dụ bên dưới)
Tôi cần trợ giúp khi thực hiện công việc này ... có bất kỳ manh mối nào mà tôi đang làm sai không?
Cảm ơn!
Ví dụ:
Trong đoạn code mẫu dưới đây, tôi chỉ cố gắng để kéo một đối tượng tùy chỉnh MyContainerClass tạo ra khi initating kéo vào sự kiểm soát nhãn trên 1) System.Windows.Forms.TextBox (Winforms) và 2) System.Windows.TextBox (WPF, được thêm vào một ElementHost).
Trường hợp 1) hoạt động tốt nhưng trường hợp 2) bị lỗi khi cố truy xuất dữ liệu thả bằng cách sử dụng GetData(). GetDataPresent ("WindowsFormsApplication1.MyContainerClass") trả về "true" vì vậy Về lý thuyết, tôi sẽ có thể lấy lại dữ liệu thả của tôi kiểu như trong Winforms.
Đây là stack trace của vụ tai nạn:
"Error HRESULT E_FAIL has been returned from a call to a COM component" with the following stack trace: at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Windows.Forms.DataObject.GetDataIntoOleStructs(FORMATETC& formatetc, STGMEDIUM& medium) at System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetDataHere(FORMATETC& formatetc, STGMEDIUM& medium) at System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData(FORMATETC& formatetc, STGMEDIUM& medium) at System.Windows.DataObject.OleConverter.GetDataInner(FORMATETC& formatetc, STGMEDIUM& medium) at System.Windows.DataObject.OleConverter.GetDataFromOleHGLOBAL(String format, DVASPECT aspect, Int32 index) at System.Windows.DataObject.OleConverter.GetDataFromBoundOleDataObject(String format, DVASPECT aspect, Int32 index) at System.Windows.DataObject.OleConverter.GetData(String format, Boolean autoConvert, DVASPECT aspect, Int32 index) at System.Windows.DataObject.OleConverter.GetData(String format, Boolean autoConvert) at System.Windows.DataObject.GetData(String format, Boolean autoConvert) at System.Windows.DataObject.GetData(String format) at WindowsFormsApplication1.Form1.textBox_PreviewDragEnter(Object sender, DragEventArgs e) in WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 48
Dưới đây là một số mã:
// -- Add an ElementHost to your form --
// -- Add a label to your form --
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Windows.Controls.TextBox textBox = new System.Windows.Controls.TextBox();
textBox.Text = "WPF TextBox";
textBox.AllowDrop = true;
elementHost2.Child = textBox;
textBox.PreviewDragEnter += new System.Windows.DragEventHandler(textBox_PreviewDragEnter);
System.Windows.Forms.TextBox wfTextBox = new System.Windows.Forms.TextBox();
wfTextBox.Text = "Winforms TextBox";
wfTextBox.AllowDrop = true;
wfTextBox.DragEnter += new DragEventHandler(wfTextBox_DragEnter);
Controls.Add(wfTextBox);
}
void wfTextBox_DragEnter(object sender, DragEventArgs e)
{
bool dataPresent = e.Data.GetDataPresent("WindowsFormsApplication1.MyContainerClass");
// NO CRASH here!
object data = e.Data.GetData("WindowsFormsApplication1.MyContainerClass");
}
void textBox_PreviewDragEnter(object sender, System.Windows.DragEventArgs e)
{
bool dataPresent = e.Data.GetDataPresent("WindowsFormsApplication1.MyContainerClass");
// Crash appens here!!
// {"Error HRESULT E_FAIL has been returned from a call to a COM component."}
object data = e.Data.GetData("WindowsFormsApplication1.MyContainerClass");
}
private void label1_MouseDown(object sender, MouseEventArgs e)
{
label1.DoDragDrop(new MyContainerClass(label1.Text), DragDropEffects.Copy);
}
}
public class MyContainerClass
{
public object Data { get; set; }
public MyContainerClass(object data)
{
Data = data;
}
}
Cảm ơn đã gửi bài này, nó đã giúp tôi giải quyết một vấn đề tương tự trong mã của tôi. Tôi đã thêm [Serializable] để thực hiện IDataObject của tôi và đột nhiên E_FAIL: s bí ẩn đã chấm dứt. –