using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ExtensionsDev { public static class ChooseFileExtension { /// /// 使用选择Wave文件的功能 /// /// ButtonEdit控件 /// 文件改变事件,参数为选择的文件和文件的采样率Hz /// public static ButtonEdit UseChooseWaveFile(this ButtonEdit ctrl, Action onFileChanged = null) { ctrl.AllowDrop = true; ctrl.DragEnter += ctrl_DragEnter; ctrl.DragDrop += ctrl_DragDrop; ctrl.ButtonClick += Ctrl_ButtonClick; ctrl.TextChanged += (sender, e) => { string file = (sender as Control).Text; if (!File.Exists(file) || onFileChanged == null) return; //从wav文件中自动读取采样率 FileInfo info = new FileInfo(file); if (info.Extension.ToLower() == ".wav") { using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read)) { fs.Position = 24; byte[] data = new byte[4]; fs.Read(data, 0, 4); var fsHz = BitConverter.ToInt32(data, 0); if (fsHz > 0) { onFileChanged(file, fsHz); } }; } else { onFileChanged(file, 0); } }; ctrl.Tag = nameof(UseChooseFile); return ctrl; } /// /// 使用通用文件选择功能 /// /// ButtonEdit控件 /// public static ButtonEdit UseChooseFile(this ButtonEdit ctrl) { ctrl.AllowDrop = true; ctrl.DragEnter += ctrl_DragEnter; ctrl.DragDrop += ctrl_DragDrop; ctrl.ButtonClick += Ctrl_ButtonClick; ctrl.Tag = nameof(UseChooseFile); return ctrl; } public static ButtonEdit UseChooseDir(this ButtonEdit ctrl) { ctrl.UseChooseFile(); ctrl.Tag = nameof(UseChooseDir); return ctrl; } private static void Ctrl_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e) { var ctrl = sender as Control; if (ctrl.Tag?.ToString() == nameof(UseChooseFile)) { XtraOpenFileDialog xtraOpenFileDialog1 = new XtraOpenFileDialog(); xtraOpenFileDialog1.Multiselect = false; var currentDir = Environment.CurrentDirectory; if (xtraOpenFileDialog1.ShowDialog() == DialogResult.OK) { Environment.CurrentDirectory = currentDir; ctrl.Text = xtraOpenFileDialog1.FileName; } } else { XtraOpenFileDialog xtraOpenFileDialog1 = new XtraOpenFileDialog(); xtraOpenFileDialog1.Multiselect = false; var currentDir = Environment.CurrentDirectory; if (xtraOpenFileDialog1.ShowDialog() == DialogResult.OK) { Environment.CurrentDirectory = currentDir; ctrl.Text = Path.GetDirectoryName(xtraOpenFileDialog1.FileName); } } } private static void ctrl_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Link; } else { e.Effect = DragDropEffects.None; } } private static void ctrl_DragDrop(object sender, DragEventArgs e) { var file = ((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString(); var ctrl = sender as ButtonEdit; bool dragFile = ctrl.Tag?.ToString() == nameof(UseChooseFile); if (dragFile) (sender as Control).Text = file; else { if (File.Exists(file)) (sender as Control).Text = Path.GetDirectoryName(file); else (sender as Control).Text = file; } } } }