【问题标题】:Implementing an OpenFileDialog with sound file preview使用声音文件预览实现 OpenFileDialog
【发布时间】:2010-06-04 17:12:51
【问题描述】:

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

  • 我可以使用各种控件(例如树视图和列表框)来创建我自己的表单来显示文件夹和文件,但我认为我会重新发明轮子,或者如果没有其他方法,我会为非常简单的事情做很多工作。你推荐这样做吗?
  • 我可以修改(继承)现有的 OpenFileDialog 并以某种方式添加声音播放按钮吗?
  • 是否有一些免费的自定义文件选择器库可供使用? (前提是许可允许包含在商业意义上。)

【问题讨论】:

    标签: c# winforms audio


    【解决方案1】:

    在对对话框进行黑客攻击之前,请先考虑一个利用 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
                //...
            }
    

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

    【讨论】:

    • 这也是一个非常可行的解决方案,我会在测试中尝试一下。
    • 同意破解对话框并不是最佳选择,但是,就用户体验而言,弹出窗口中的弹出窗口也不是...
    【解决方案2】:

    在问我自己之前搜索时发现了这个问题。 Hans 的回答可能会稍微简化一点,即使用标准消息框,而不必编写自己的表单。尽管如此,仍然是一个弹出窗口。

        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 提供一个干净的标准接口

    【讨论】:

      【解决方案3】:

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

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

      第一个看起来像您想要实现的目标。

      祝你好运。

      【讨论】:

      • 实际上是第二个,因为这是 Winforms 而不是 WPF。不过看起来很有希望!谢谢你的链接,我去看看。
      • 如果您已经获得了 Framework 3+ 的依赖项,您可以在 WinForms 应用程序中使用 WPF...然后也许您也可以稍微提高一下... :)
      • 我最终有这些学习 WPF 的计划......不幸的是,对于这个应用程序,我没有时间升级我的 noobishness! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2013-12-13
      • 2023-03-20
      相关资源
      最近更新 更多