気軽に遊べるミニゲームを制作しています

ブラウザゲームまとめ

【c# WPF道場】ドラッグ&ドロップでファイルを取得する

WPF

事前準備

まずはフォームを作成していきます。

MainWindowにListBoxを配置します。

サイズを適切な大きさに変更します。

配置したリストボックスのプロパティを変更していきます。

リストボックスに任意の名前をつけて、共通の v 記号を押して、隠れている項目を表示します。

表示されたAllowDropに☑をいれます。

コードを編集

まずはMainWindowを編集していきます。

ファイルがドロップされたときにリストボックスに追加される。という処理を追加したいので、ObservableCollection<T> クラスを使用して、リストボックスのデータ更新を行います。

公式リファレンス:ObservableCollection<T> クラス (System.Collections.ObjectModel) | Microsoft Learn
“項目が追加または削除されたとき、またはリスト全体が更新されたときに通知を提供する動的データ コレクションを表します。”

namespace WpfDropBox
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<string> list1;

        public MainWindow()
        {
            InitializeComponent();

            list1 = new ObservableCollection<string>();
            ListBox1.ItemsSource = list1;
        }
    }
}

ListBoxの内容(ItemsSource)を動的データコレクション(list1)に置き換えます。

続いて、ファイルドロップされたときに、このlist1を更新する処理を作成します。

ファイルドロップ時にリストを更新

フォーム作成画面に戻って、プロパティ画面に注目します。

右側にある⚡マークをクリックして、イベントハンドラ画面に移行します。

Dropの項目に任意の関数名を入力して、Enterを押して、コード編集画面に移行します。

エクスプローラーのデータ(e.Data)がドロップされたときに、データコレクション(list1)にフルパスを追加します。

list1はリストボックスと紐づいているため、ファイルがドロップされたときに、ドロップされたファイルのフルパスがリストボックスに表示されるようになります。

        private void DataDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                var fileFullPass = (string[])e.Data.GetData(DataFormats.FileDrop);
                foreach (var fullPass in fileFullPass)
                {
                    list1.Add(fullPass);
                }
            }
        }

デスクトップ内のデータをドロップしてみます。

データが追加され、リストボックスにはフルパスが表示されています。

SelectionChanged ビルドエラーが起きるとき

リストボックスをダブルクリックすると、下記の関数が追加されます。

これを削除した後、ビルドするとSelectionChangedの定義が~というエラーを吐きますが、これはListBoxにSelectionChangedが一度追加されたことが原因です。

MainWindow編集画面に戻って、リストボックスをクリックすると、下のXAMLのところにSelectionChanged = ~ と追加されています。これを / の手前まで削除してください。そうすると、ビルドできるようになります。

リスト内のデータを削除したり、使用する

リスト内のデータ削除は簡単です。

クリアボタンをフォーム上に設置します。

プロパティの情報は何でも良いですが、下記にしています。

Clear関数を使って、リスト内のデータを削除します。

        private void Clear_Click(object sender, RoutedEventArgs e)
        {
            list1.Clear();
        }

リストに追加したデータを扱う

ドロップしたデータを扱います。データはList型なので、List[?]で使用します。

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(list1[2]);  //3番目のデータを表示
        }

すべてのデータを扱いたい場合は、List.Add同様、foreachでループさせると良いかと思います。

コメント

タイトルとURLをコピーしました