在多个 windows 之间切换

Switch between multiple windows

我们有一个应该支持多个变体的软件系统。每个变体应包含一个或多个 UI 组件的自定义版本(在本例中为 Windows 表单)。

已在VS2017中创建原型,解决方案如下; ProductFoo(解决方案)

在这个简单的原型中,MainApplicationForm1 表单包含一个按钮,单击该按钮时应根据选择的变体在 XY1 和 XY2 库中显示 Form1.cs

为了解决这个问题,我们使用以下解决方案配置更新了解决方案管理器;

然后我们为 MainApplication 添加了条件编译符号。

然后我们从 MainApplication 添加了对 XY1 和 XY2 项目的引用。

最后,我们在MainApplicationForm1.cs

中添加了如下代码
public partial class MainAppForm1 : Form
{
    public MainAppForm1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    #if XY1
        XY1.Form1 form = new XY1.Form1();
        form.ShowDialog();
    #elif XY2
        XY2.Form1 f1 = new XY2.Form1();
        f1.ShowDialog();
    #else
        #error The MainApplication is missing Form1
    #endif
    }
}

此解决方案有效,但我对使用预处理器指令持保留意见。代码看起来很乱,很快就会变得难以维护。这种情况的最佳做法是什么?

感谢任何意见。

你的问题很宽泛,涉及到你想要的项目的基础结构。

您选择的方式与Feature toggling接近,只是根据构建配置完成的。通常它应该是这样的:

if(features.IsOn("XY1-feature")){
    XY1.Form1 form = new XY1.Form1();
    form.ShowDialog();
}

经典方式可以给你更多的灵活性。例如。将功能切换到配置将使您有可能为特定部署动态切换不同的功能,但作为影响,它会增加复杂性并需要更多测试

我建议您深入了解 Dependency injection and Strategy pattern

作为功能切换的替代方法,您可以使用分支。为特定的 project/client 创建一个特定的分支。这可能会给你带来合并问题,但会让你的特定实现更干净。它最适合项目之间有很多细微差别的项目

我建议使用两个单选按钮来解决这个问题。这是一个非常简单的方法。

SelectradioButton1,弹出XY1.Form

SelectradioButton2,弹出XY2.Form

MainApplicationForm1.cs:

private void radioButton1_CheckedChanged(object sender, EventArgs e)

    {
        if (radioButton1.Checked) 
        {
            XY1.Form1 form = new XY1.Form1();
            form.Show();                
        }
        
    }
    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {
        if (radioButton2.Checked)
        {
            XY2.Form1 f1 = new XY2.Form1();
            f1.Show();               
        }
    }