【问题标题】:DialogResult with FolderBrowserDialog in WPFWPF中带有FolderBrowserDialog的DialogResult
【发布时间】:2013-01-26 15:14:48
【问题描述】:

我第一次在 WPF 中实现 FolderBrowserDialog,但我一点也不喜欢它...

除了我发现我的项目中没有引用 Windows.Forms 的问题之外,现在我在尝试查看 DialogResult 返回值是什么时遇到了麻烦...

使用 OpenFileDialog,过去我就是这样做的:

OpenFileDialog ofd = new OpenFileDialog();
Nullable<bool> result = ofd.ShowDialog();

if (result == true)
{
    // all went well, carry on and do your thing here
}

不幸的是,我现在遇到了一些关于从 DialogResult 类型转换为 bool 以及任何你有的东西的错误。

似乎找不到任何关于如何完成在 WPF 中使用对话框的这一步的任何信息,谁能解释一下?

提前致谢!

编辑

这是我修改后的代码,没有类型转换错误。我不确定要检查 result 的值。通常我会使用DialogResult.OK,除非它在此处显示为无效值。

    private void btnBrowse_Click(object sender, RoutedEventArgs e)
    {
        if (cmbTemplate.SelectedItem == "Blockbusters")
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            DialogResult result = fbd.ShowDialog();

            //
            // ERROR: 'System.Nullable<bool>' does not contain a definition for 'OK'
            // and no extention method 'OK' accepting a first argument of type
            // 'System.Nullable<bool>' could be found.
            //
            if (result == DialogResult.OK)
            {
                txtSource.Text = fbd.SelectedPath;
            }
        }
    }

【问题讨论】:

  • Windows 窗体 Dialog 不像 WPF 对话框那样返回可为空的布尔值,而是返回 DialogResult。只是一个提示。 :)
  • 如果您无法理解不同类型之间转换的错误,也许您应该在尝试在 WPF 中做一些事情之前回到 OOP 和 C# 基础,这是一个不适合没有经验的开发人员的复杂框架。
  • @HighCore 虽然您的建议可能是最中肯的,但也无关紧要。我理解错误,这就是为什么我尝试将结果设置为 DialogResult 对象,但在 if 语句中仍然不起作用 - 因此我感到困惑
  • 你可以用var代替Nullable, var result = ofd.ShowDialog();

标签: c# wpf folderbrowserdialog


【解决方案1】:

这里迟到的答案,但为什么不只是 . .

private void SelectFolder()
{
    var dialog = new FolderBrowserDialog();
    var status = dialog.ShowDialog(); // ShowDialog() returns bool? (Nullable bool)
    if (status.Equals(true))
    {
        SelectedFolderPath = dialog.SelectedPath;
    }
}

您可以在调试会话中看到结果。单击取消按钮时返回 false。

【讨论】:

    【解决方案2】:

    好的,事实证明这里其他答案的所有答案都是正确的。

    他们只是错过了一件事,我认为那是我的错......

    每次我在 Intellisense 中看到 DialogResult 在我的 if 语句中尝试使用它时(正如我被告知要使用的那样,我看到了这个:

    布尔? Window.Dialog.Result
    获取或设置对话结果值,即从
    返回的值 System.Windows.Window.ShowDialog() 方法。

    例外情况:
    System.InvalidOperationException

    这个特殊的 DialogResult 对象不是我要找的那个。

    最终奏效的是:

    DialogResult result = fbd.ShowDialog();
    
    if (result == System.Windows.Forms.DialogResult.OK)
    {
        // do work here
    }
    

    值得注意的是,我在 usings 中确实引用了 System.Windows.Forms,这就是为什么我从未想过像上面的 sn-p 中那样从 System 中引用该类。我还以为它在用这个呢。

    【讨论】:

    • 顺便说一句,我强烈建议不要在 WPF 中执行cmbTemplate.SelectedItem == "Blockbusters" 之类的操作。 UI is not Data,因此您不应将 UI 元素视为数据元素,并根据这些元素的状态定义程序逻辑。
    • 注意到了,通常我不这样做,但由于我是 WPF 新手,我还没有找到更好的方法(不是我已经非常努力地尝试过)。尽管组合框中每个项目的文本在执行期间的任何时候都不会更改,所以我真的不太担心
    【解决方案3】:

    DialogResult是一个枚举,定义了一些值来表示对话框的返回值。

    在您的代码中,您应该检查DialogResult.OK 以使用对话框中选择的路径来初始化您的变量。在对话框中按下“确定”按钮时返回DialogResult.OK,否则返回DialogResult.Cancel

    if (result == DialogResult.OK){
      txtSource.Text = fbd.SelectedPath;
    }
    

    【讨论】:

    • 取自问题:Typically I'd use DialogResult.OK except that doesn't appear as a valid value here.
    【解决方案4】:

    DialogResult.(OK,取消你想检查的任何内容),

    if (result == DialogResult.OK) // DialogResult.(Your desired result, select from the list it generates)
    {
        txtSource.Text = fbd.SelectedPath;
    }
    

    【讨论】:

    • 取自问题:Typically I'd use DialogResult.OK except that doesn't appear as a valid value here.
    猜你喜欢
    • 2011-10-01
    • 2011-10-07
    • 2012-08-30
    • 2010-10-28
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多