我的应用程序中有一些UserControls,我需要支持拖放,因此我将代码解压缩为扩展UserControl的抽象类(下面的代码)。当我在一个控件中使用它时,它是ListBox中DataTemplate的一部分,一切正常。
当我在控件中使用它也可以作为放置目标时,我在DoDragDrop行上得到以下异常:
COMException
Error HRESULT E_FAIL has been returned from a call to a COM component
这似乎与WinForms互操作有关,但我没有使用任何WinForms或COM组件 - 该应用程序是纯WPF。
如果我继续执行,则丢弃成功。如果我用带有空catch块的try块包围DoDragDrop调用,一切似乎都按预期工作。我真的不想用这种黑客来发送代码。
public abstract class DraggableUserControl : UserControl
{
private Point? lastMouseDownPoint;
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
lastMouseDownPoint = e.GetPosition(this);
}
protected override void OnMouseMove(System.Windows.Input.MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.LeftButton == MouseButtonState.Pressed && lastMouseDownPoint != null)
{
Point mousePosition = e.GetPosition(this);
if (((Point)lastMouseDownPoint - mousePosition).Length > 3)
{
BeginDrag();
}
}
}
protected override void OnMouseLeave(MouseEventArgs e)
{
base.OnMouseLeave(e);
if (e.LeftButton == MouseButtonState.Pressed && lastMouseDownPoint != null)
{
BeginDrag();
}
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (e.ChangedButton == MouseButton.Left)
{
lastMouseDownPoint = null;
}
}
private void BeginDrag()
{
DataObject dragData = new DataObject(DragFormat, DragData);
//try
//{
DragDrop.DoDragDrop(this, dragData, DragDropEffects.Move);
//} catch {}
lastMouseDownPoint = null;
}
protected abstract String DragFormat
{ get; }
protected abstract Object DragData
{ get; }
protected abstract DragDropEffects DragAllowedEffects
{ get; }
}
答案 0 :(得分:3)
使用您的类创建的一个简单示例似乎工作得很好。我使用了DataFormats.StringFormat的字符串和DragFormat。它运作得很好。 汉斯是对的,没有办法重演。
我假设数据对象是什么,以某种方式弄乱了Get Data反射,或者它将其传回。
我的建议是分解您的数据对象,看看是否有任何特定部分存在同样的问题。