私はドラッグアンドドロップのサポートが必要な私のアプリケーションにいくつかのUserControlを持っていますので、UserControl(以下のコード)を拡張する抽象クラスにコードを抽出しました。 ListBox内のDataTemplateの一部である1つのコントロールでこれを使用すると、すべて正常に動作します。COMコンポーネントからHRESULT E_FAILを投げているアプリケーション内でWPFをドラッグ
私もドロップターゲットすることができコントロールでそれを使用すると、私はDoDragDrop関数の行に次の例外を取得:
COMException
Error HRESULT E_FAIL has been returned from a call to a COM component
これは、WinFormsの相互運用への可能性に関連すると思われるが、私は使っていませんよ任意のWinFormsまたはCOMコンポーネント - アプリケーションは純粋なWPFです。
実行を続行すると、ドロップが正常に行われました。 DoDragDropコールを空のcatchブロックを持つtryブロックで囲むと、すべてが期待通りに機能しているように見えます。私は本当にこの種のハックでコードを発送したくはありません。
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; }
}
D + DはCOMベースです.E_FAILはCOMエラーです。ドラッグされているものと、ドロップターゲットは何もあなたのスニペットで完全に見えません。誰もがこれを叱責することはできません。 –
残念ながら、データオブジェクトは大きすぎてここに投稿することはできません。ドロップターゲットUserControlは非常に簡単ですが、グリッド内の境界内のイメージです。私は両方のソースから同じオブジェクトのデータオブジェクトが問題ではないと仮定していますが、ListBoxのDataTemplateソースからうまく動作します – TheEvilPenguin