代码之家  ›  专栏  ›  技术社区  ›  JYelton Melchior Blausand

使用声音文件预览实现OpenFileDialog

  •  1
  • JYelton Melchior Blausand  · 技术社区  · 14 年前

    我想实现一个打开文件对话框或文件浏览器,另外提供一个“预览”按钮来播放当前选定的声音文件(尤其是波形格式,此应用程序不需要其他格式)。

    • 我可以用各种控件(如TreeView和ListBox)创建我自己的窗体来显示文件夹和文件,但我认为我将重新设计控制盘,或者如果没有其他东西可以做很多简单的工作。你建议这样做吗?
    • 我可以修改(继承)现有的OpenFileDialog并以某种方式添加声音播放按钮吗?
    • 有没有一些可以使用的自定义文件选取器的免费库?(前提是许可证允许包含在商业意义上。)
    3 回复  |  直到 8 年前
        1
  •  1
  •   Reddog    14 年前

    关于第2点,我认为OpenFileDialog(或saveFileDialog)不能以任何方式扩展——它们是由操作系统提供的。

    但事实证明,它们可能是:

    第一个看起来像是你想要达到的目标。

    祝你好运。

        2
  •  2
  •   Hans Passant    14 年前

    在您对对话框进行黑客攻击之前,首先考虑一个利用fileok事件的简单解决方案。创建一个名为frmpreview的表单。给它一个接受字符串的构造函数。您需要一个“取消”和一个“确定”按钮以及代码来播放该文件。

    按如下方式显示该窗体:

            var dlg = new OpenFileDialog();
            // Set other dlg properties...
            dlg.FileOk += (s, cancel) => {
                using (var prev = new frmPreview(dlg.FileName)) {
                    if (prev.ShowDialog() != DialogResult.OK) cancel.Cancel = true;
                }
            };
            if (dlg.ShowDialog(this) == DialogResult.OK) {
                // use the file
                //...
            }
    

    现在,只要用户单击打开,就会显示预览表单。用户可以单击“取消”并从对话框中选择另一个文件。

        3
  •  2
  •   user3024825    8 年前

    在问我自己之前,在搜索时发现了这个问题。汉斯的回答可能会稍微简化一点,那就是使用一个标准的信息框,而不是自己写表格。不过还是弹出窗口。

        private void btnSelect_Click(object sender, RoutedEventArgs e) {
            var dlg = new Microsoft.Win32.OpenFileDialog {
                DefaultExt = ".csv",
                Filter = "Wav Files Only (*.wav)|*.wav",
                InitialDirectory = "C:\\Windows\\Media\\",
                CheckFileExists = true
            };
            dlg.FileName = "preselect the existing file if you wish";
            dlg.FileOk += (s, cancel) => {
                var player = new MediaPlayer();
                player.Open(new Uri(dlg.FileName));
                player.Play();
                var msgres = MessageBox.Show(Path.GetFileName(dlg.FileName)+"\nUse this sound?", "Sound Playing", MessageBoxButton.YesNo);
                if (msgres != MessageBoxResult.Yes) cancel.Cancel = true;
                player.Stop(); //in case it is a long sound
            };
            var result = dlg.ShowDialog();
            if (result != true) return;
            //do whatever with dlg.FileName ...
        }
    

    使用MessageBox提供了一个干净的标准接口