Partilhar via


ブログ用 画像ユーティリティ ③ ドラッグ&ドロップ

ドラッグ&ドロップにはドロップされたファイルの読み込みのサンプルを利用します。まず、ドラッグ&ドロップが可能になるように、Windows1.xamlのWindow要素にAllowDrop=”True”と、PreviewDropおよびPreviewDragOverイベントハンドラを追加し、Window1.xaml.csでこのコールバックを実装します。

PreviewDragOverのコールバックでは、DragEvetArgsの内容をチェックして、ドラッグされたのが1つのファイルかどうかをチェックします。そしてドラッグされたのがディレクトリや複数ファイルのときはドロップできないようにします(DragDropEffect.None)。

PreviewDropのコールバックでも、ドロップされたファイルが1つであることを確認してから、jpgファイルかどうかをチェックし、取得したファイル名をユーザーコントロールのオブジェクトmyVgaImageのFileNameプロパティに代入します。ClipRectプロパティを初期化しているのは、以前にあったモザイク矩形を消すためです。

private void myImage_Drop(object sender, DragEventArgs e)
{
  e.Handled = true;
  string draggedFileName = IsSingleFile(e);
  if (draggedFileName.Contains(".jpg") ||
draggedFileName.Contains(".JPG"))
  {
    myVgaImage.FileName = draggedFileName;
    myVgaImage.ClipRect = new Rect();
  }
  else
  {
    MessageBox.Show("jpg以外の画像は処理できません、
      jpgの画像をドラッグしてください", "not jpg file",
MessageBoxButton.OK);
  }
}  

private string IsSingleFile(DragEventArgs args)
{
  // データオブジェクト内のファイルをチェック 
  if (args.Data.GetDataPresent(DataFormats.FileDrop,
true))
  {
    string[] fileNames =
args.Data.GetData(DataFormats.FileDrop, true)
as string[];
    // 単一ファイル/フォルダをチェック 
    if (fileNames.Length == 1)
    {
    // ファイルをチェック(ディレクトリはfalseを返す) 
      if (File.Exists(fileNames[0]))
      {
      // この時点で単一ファイルであることが分かる 
        return fileNames[0];
      }
    }
  }
  return null;
}  

private void myImage_PreviewDragOver(
object sender,
DragEventArgs args)
{
  // 単一ファイルだけを処理したい 
  if (IsSingleFile(args) != null)
args.Effects = DragDropEffects.Copy;
  else args.Effects = DragDropEffects.None;
  // イベントをHandledに、するとDragOverハンドラが
// キャンセルされる 
  args.Handled = true;
}