WPF在应用程序中拖动从COM组件抛出HRESULT E_FAIL

时间:2010-11-30 23:22:04

标签: c# wpf

我的应用程序中有一些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; }
}

1 个答案:

答案 0 :(得分:3)

使用您的类创建的一个简单示例似乎工作得很好。我使用了DataFormats.StringFormat的字符串和DragFormat。它运作得很好。 汉斯是对的,没有办法重演。

我假设数据对象是什么,以某种方式弄乱了Get Data反射,或者它将其传回。

我的建议是分解您的数据对象,看看是否有任何特定部分存在同样的问题。