WPF中使用FolderBrowserDialog的DialogResult

9

这是我第一次在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;
            }
        }
    }

2
Windows Forms的“Dialog”不像WPF对话框那样返回可空布尔值,而是使用“DialogResult”。这只是一个提示。 :) - Patryk Ćwiek
1
如果你无法理解不同类型之间的转换错误,也许在尝试使用复杂框架WPF之前,你应该回到面向对象编程和C#基础知识。因为WPF并不适合经验不足的开发人员。 - Federico Berasategui
@HighCore,虽然您的建议可能是最相关的,但也是无关紧要的。我理解这个错误,这就是为什么我尝试将结果设置为DialogResult对象,但在if语句中仍然无法工作-因此我感到困惑。 - Ortund
你可以使用 var 替代 Nullable<bool>,var result = ofd.ShowDialog(); - fhnaseer
4个回答

17

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

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

每次我在Intellisense中看到DialogResult,当我试图在我的if语句中使用它时(因为我被告知要使用它),我看到了这个:

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

异常:
System.InvalidOperationException

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

最后起作用的是以下内容:

DialogResult result = fbd.ShowDialog();

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

值得注意的是,我在我的 using 中引用了System.Windows.Forms,这就是为什么我从未想过如上段代码片段一样引用来自 System 的类。我认为它已经在使用这个了。


顺便提一下,在WPF中,我强烈建议不要做像cmbTemplate.SelectedItem == "Blockbusters"这样的事情。UI不是数据,因此您不应将UI元素视为数据元素,并根据这些元素的状态定义程序逻辑。 - Federico Berasategui
已经注意到了,通常我不这样做,但是因为我是WPF的新手,我还没有找到更好的方法来实现它(并且我也没有很努力地尝试过)。虽然下拉框中每个项目的文本在执行期间不应该被修改,所以我并不太担心。 - Ortund

0

回答晚了,但为什么不只是. .

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

您可以在调试会话中查看结果。当单击取消按钮时,它将返回false。


0

DialogResult 是一个枚举类型,用于指示对话框返回值的取值。

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

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

通常我会使用 DialogResult.OK,但在这里似乎不是有效值。 - Ortund

-1

DialogResult.(OK, Cancel whatever you want to check),

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

通常我会使用 DialogResult.OK,但在这里似乎不是有效值。 - Ortund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接