构建应用程序GUI

时间:2013-08-28 02:54:19

标签: c# winforms visual-studio-2010

首先,这是我在Visual Studio 2010中使用C#构建的简单应用程序,文件名是 program.cs ,所有进程都将在命令提示符下显示。

public static void Main(string[] args)
{
    int input = Convert.ToInt32(Console.ReadLine());
    switch (input)
    {
        case 1:
            Console.WriteLine("A");
            break;
        case 2:
            Console.WriteLine("B");
            break;
        case 3:
            Console.WriteLine("C");
            break;
        default:
            Console.WriteLine("default");
            break;
    }
}

我想构建一个GUI,使其更加用户友好。

我创建了一个包含 ComboBox Label Button 的表单。 ComboBox中的值为[1,2,3,默认值]。我想让用户在ComboBox中选择一个值,点击Button,程序会将标签更新为[A,B,C,默认]。

如何在program.cs中保留逻辑,并实现上述目标?

我创建了一个表单,visual studio生成一个看起来像这样的Form1.cs

namespace quickTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

所以我认为我遇到的问题是我不知道 program.cs 如何获取/设置Form1的值

Main()中,我添加了Application.Run(new Form1());,因此它运行表单而不是命令提示符,但后来我被卡住了。我试过comboBox1.SelectedValue但我只能在From1.cs而不是program.cs中获得价值,我需要它在program.cs中,所以我可以应用逻辑。

为了澄清,这只是我构建的一个示例。实际的 program.cs 包含更多的逻辑,但我不认为这会影响我想要做的事情所以我没有把它放在描述中。我需要一种方法来从 program.cs 获取并设置值到表单。

2 个答案:

答案 0 :(得分:2)

我不相信最好的解决方案是在控制台应用程序中添加GUI,但我之前遇到过类似情况,并且能够成功完成。最好的选择是将逻辑重构为可以从单独的GUI应用程序引用的库。

在表单类中创建事件并从program.cs订阅它们以驱动需要发生的逻辑。您可以使用EventArgs类将值传递给逻辑或从逻辑传递值。这基本上就是当您编写驱动表单的代码时所执行的操作,您只是将其卸载到单独的类中。

更新:添加了示例代码

这是基于事件的基本编程。通过使用泛型,我们可以大大减少样板代码的数量,但最好通过泛型来了解我们自动创建的代理。如果你在错误出现时不理解它们是如何工作的,那么快捷方式可能是一个障碍。

活动如何:http://msdn.microsoft.com/en-us/library/w369ty8x.aspx

通用代表:http://msdn.microsoft.com/en-us/library/sx2bwtw7.aspx

举个例子,我创建了一对表格。 MainWindow有一个文本框OutputBoxDetachedForm有一个组合框OptionComboBox和一个按钮TriggerButton,我们将使用它来触发事件。

MainWindow类:

public partial class MainWindow : Form
{
    public MainWindow()
    {
        InitializeComponent();
        DetachedForm detachedForm = new DetachedForm();
        detachedForm.SelectionMade += new EventHandler<SelectionMadeEventArgs>(detachedForm_SelectionMade);            
        detachedForm.Show();
    }

    void detachedForm_SelectionMade(object sender, SelectionMadeEventArgs e)
    {
        OutputBox.Text = e.ActualSelection;
    }
}

DetachedForm类

public partial class DetachedForm : Form
{
    public event EventHandler<SelectionMadeEventArgs> SelectionMade;

    public DetachedForm()
    {
        InitializeComponent();
    }

    private void OnSelectionMade(SelectionMadeEventArgs e)
    {
        EventHandler<SelectionMadeEventArgs> handler = SelectionMade;

        if (handler != null)
        {
            handler(this, e);
        }
    }

    private void TriggerButton_Click(object sender, EventArgs e)
    {
        if (OptionComboBox.SelectedItem != null)
        {
            SelectionMadeEventArgs args = new SelectionMadeEventArgs(OptionComboBox.SelectedItem.ToString());
            OnSelectionMade(args);
        }
    }
}

public class SelectionMadeEventArgs : EventArgs
{
    public SelectionMadeEventArgs(String actualSelection)
    {
        ActualSelection = actualSelection;
    }

    public String ActualSelection { get; set; }
}

答案 1 :(得分:0)

您可以在Form1.cs中公开获取/设置组合框值的公共函数或属性,然后在program.cs中,您可以访问该函数来设置或获取组合框。