是否可以在Windows控制台应用程序中具有保存文件对话框()

本文关键字:保存文件 对话框 应用程序 Windows 控制台 是否 | 更新日期: 2023-09-27 18:27:05

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Diagnostics
{
    class Program
    {
        static void Main(string[] args)
        {
            string filename = null;
            using (SaveFileDialog sFile = new SaveFileDialog())
            {
                sFile.Filter = "Text (Tab delimited)(*.txt)|*.txt|CSV (Comma separated)(*.csv)|*.csv";
                if (sFile.ShowDialog() == DialogResult.OK)
                {
                    filename = sFile.FileName;
                    WriteRegKey(diagnostic, filename);
                }
            }
        }
    }
}

我收到一个错误:找不到类型或命名空间名称"SaveFileDialog"(是否缺少 using 指令或程序集引用?

我确实尝试添加System.Windows.Forms命名空间,但我无法添加。

是否可以在Windows控制台应用程序中具有保存文件对话框()

必须添加对System.Windows.Forms程序集的引用。

此外,还必须将 STAThread 属性添加到应用程序入口点方法中。

[STAThread]
private static void Main(string[] args)
{
    using (SaveFileDialog sFile = new SaveFileDialog())
    {
        sFile.ShowDialog();
    }
    Console.ReadKey();
}

但老实说,这是一个糟糕的主意。控制台应用程序不应具有控制台本身的任何其他 UI。正如 SaveFileDialog 的命名空间所建议的那样,SaveFileDialog 应仅用于Forms

你可能会发现,扭转问题并拥有带有控制台的 Windows 窗体应用更容易。为此,请在 Visual Studio 中创建 Windows 窗体应用。删除它创建的默认表单。打开程序.cs并删除尝试创建窗口的代码,并将其替换为控制台应用代码。

现在的诀窍是您需要手动创建控制台。您可以使用以下帮助程序类执行此操作:

public class ConsoleHelper
{
    /// <summary>
    /// Allocates a new console for current process.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean AllocConsole();
    /// <summary>
    /// Frees the console.
    /// </summary>
    [DllImport("kernel32.dll")]
    public static extern Boolean FreeConsole();
}

现在在你的程序开始时(在你尝试和Console.Writeline之前(调用

ConsoleHelper.AllocConsole(); 

在程序调用的最后

ConsoleHelper.FreeConsole();

现在,你有一个可以创建 WinForms 对话框(包括 SaveFileDialog(的控制台应用。

您需要将对

System.Windows.Forms 的引用添加到项目本身,而不是源文件。右键单击">解决方案资源管理器"工具箱中的项目图标,然后选择"添加引用"。

尚未将命名空间 System.Windows.Forms 导入到您的代码中。

您需要从"添加引用"对话框添加对System.Windows.Forms的引用。然后调用命名空间"using System.Windows.Forms">(不带引号(并创建SaveFileDialog Class的对象。