将一个C#控制台应用程序与GUI集成

11
我刚刚开始使用C#进行开发不到3个月,目前我用Visual Studio 2015做了一个控制台应用程序。该应用程序使用Web服务,对XML进行反序列化、格式化并保存在Access数据库中,最后将成功或错误的XML发送回Web服务器。该应用程序由3个类组成:主流类、SOAP客户端类和DB类。
现在,我需要将这个控制台应用程序与GUI集成在一起,并展示从反序列化的XML获取的一些数据(这是利益相关者在进入开发阶段之前没有考虑到的项目扩展),但我不知道如何做。
到目前为止,我正在阅读关于"构建WPF应用程序"和"Windows表单"的文档,但是资料很多,我不知道自己是否走上了正确的道路。因此,在我开始编写可能不是最佳选项来集成我的控制台应用程序与GUI之前,你们能给我一些指导吗?有没有方法使控制台应用程序变成基于GUI的应用程序?
如果您能提供实际的教程链接,快速实现GUI,我将不胜感激,因为我的时间已经不多了,我需要立即开始编码。非常感谢您阅读这篇文章并帮助我。
4个回答

5
你想要实现的其实相对简单直接。你需要从一个新的 Windows FormsWPF 应用程序中启动现有的控制台应用程序进程,并订阅其输入和输出流。
如果你不想将当前的控制台应用程序显示为可见窗口,请记得将CreateNoWindow设置为 true。
var processStartInfo = new ProcessStartInfo(fileName, arguments);
processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;
processStartInfo.CreateNoWindow = true;
// etc.

这里有一篇文章,讲解了所有步骤:在C#应用程序中嵌入控制台
如果您想更仔细地查看,可以在GitHub上找到上述文章的代码。以下是一个示例,展示了可以进行的嵌入方式: enter image description here 使用该项目,您可以轻松隐藏整个控制台或将其与一些自定义UI控件并排放置,以进一步处理您的数据。

4
如果您只是想要一个简单的GUI界面,不太在意它的外观,我建议您右键单击项目 -> 添加 -> Windows窗体。

然后,将控制台应用程序转换为基于GUI的应用程序就像实例化您的派生自Form的类并调用.ShowDialog()一样简单。

示例:

using System.Windows.Forms;

//Note: if you create a new class by clicking PROJECT->Add Windows Form,
//then this class definition and the constructor are automatically created for you.
//Open MyFancyForm.cs, right click on the form, and click View Code to see it.
public partial class MyFancyForm : Form
{
    public MyFancyForm()
    {
        InitializeComponent();
    }
}

static void Main(string[] args)
{
     var guiForm = new MyFancyForm();

     guiForm.ShowDialog();//This "opens" the GUI on your screen
}

很简单。我建议你将一个新的类作为WindowsForm添加到你的项目中,而不仅仅是一个类,这样你就可以访问表单设计器。当然,你需要向你的表单类添加字段,并使其适当地填充GUI。
编辑:如果你希望完全替换掉控制台,请右键单击你的项目->属性,然后将“输出类型”更改为Windows应用程序。

虽然 OP 没有明确指出他想要隐藏控制台,但我已经修改了我的答案,包括您的建议。 - user2647513
感谢您的回复。我正在尝试按照您的建议进行操作:project->add->Windows Form,我已经将其命名为“我的精美表单”(并非真的),在同一文件中的命名空间内实例化了部分类作为控制台应用程序的主要流类,就像您所编写的代码一样。然而,VS在下划线标记行public MyFancyForm()时抛出以下错误:_Type MyFancyForm already defines a member called '.ctor' with the same parameter types_。另外,请原谅我的无知,InitializeComponent()是什么?我的意思是,我应该在里面设置Web表单的东西吗?谢谢。 - andres_v
啊,对不起,我相信我的示例有点误导人。当你通过点击“项目->添加->Windows窗体”来添加表单时,VS会自动创建“public partial class MyFancyForm”的代码,所以你不必手动输入任何内容。要查看表单的代码,请在解决方案资源管理器中双击MyFancyForm.cs,然后右键单击表单本身并单击“查看代码”。我会编辑我的答案,使其更清晰明了。 - user2647513
谢谢你,伙计。你帮了我一个大忙。 - andres_v
如何将参数传递给 guiForm.ShowDialog(); 方法以便在窗体上显示它们?比如一个字符串或者一个字符串列表。目前我正在发送一个字符串,但是VS显示了这个错误:无法从 'string' 转换为 'System.Windows.Forms.IWin32Window'。我在网上寻找解决方法,但是似乎没有任何有效的办法。 - andres_v
显示剩余5条评论

0

0

不谈“为什么”的前提下,如果你有一个控制台应用程序项目,你可以右键点击该项目 -> 属性 -> 应用程序,并将输出类型更改为类库(或Windows应用程序)。

如果你选择类库,则可以从任何地方使用你的库。

See attached image...


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