2010-11-30 24 views
2

私はドラッグアンドドロップのサポートが必要な私のアプリケーションにいくつかの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; } 
} 
+1

D + DはCOMベースです.E_FAILはCOMエラーです。ドラッグされているものと、ドロップターゲットは何もあなたのスニペットで完全に見えません。誰もがこれを叱責することはできません。 –

+0

残念ながら、データオブジェクトは大きすぎてここに投稿することはできません。ドロップターゲットUserControlは非常に簡単ですが、グリッド内の境界内のイメージです。私は両方のソースから同じオブジェクトのデータオブジェクトが問題ではないと仮定していますが、ListBoxのDataTemplateソースからうまく動作します – TheEvilPenguin

答えて

3

あなたのクラスで作成された簡単な例はうまくいくようです。私は、DataFormats.StringFormatの文字列とDragFormatを使用しました。それはうまくいった。 ハンスはそうです、再作成する方法はありません。

私は、Dataオブジェクトが何であれ、何らかの形でGet Dataリフレクションを無効にするか、それを元に戻します。

あなたのデータオブジェクトを分割して、特定の部分に同じ問題があるかどうかを確認することをお勧めします。

+0

私は半分は私が十分な情報を投稿することができないだろうと思った:)私はデータオブジェクトと一緒に私が問題を見つけることができるかどうかを確認する – TheEvilPenguin

関連する問題