0

我正在开发一个 WinForm 应用程序,到目前为止,我在管理大小和内容方面做得很糟糕。我希望有人能给我一个例子,说明如何打破我在主表单 cs 文件中的一些逻辑。

这是我在 MainWindow.cs 中的 EventHandler 函数的示例:

    private void GroupBoxRequestTypeCheckedChanged(object pSender, EventArgs pEventArgs)
    {
        RadioButton vRadioButton = pSender as RadioButton;

        if (vRadioButton != null)
        {
            this.fSelectedButton = vRadioButton.Checked ? vRadioButton : null;

            if (vRadioButton.Equals(this.RadioButton_Copy) || vRadioButton.Equals(this.RadioButton_Delete) || vRadioButton.Equals(this.RadioButton_Download)
                || vRadioButton.Equals(this.RadioButton_Move) || vRadioButton.Equals(this.RadioButton_Upload))
            {
                this.GroupBox_Files.Enabled = true;
                this.GroupBox_Variables.Enabled = false;
            }
            else
            {
                this.GroupBox_Files.Enabled = false;
                this.GroupBox_Variables.Enabled = true;
            }
            if (this.fSelectedButton != null)
            {
                if (this.fSelectedButton.Equals(this.RadioButton_Delete))
                {
                    this.TextBox_DestinationFile.Enabled = false;
                    this.Button_DestinationBrowse.Enabled = false;
                }
                else
                {
                    this.TextBox_DestinationFile.Enabled = true;
                    this.Button_DestinationBrowse.Enabled = true;
                }
            }
        }
    }

所以这只是我在表单中拥有的众多 EventHandler 之一。我创建了一个 MainForm,它有一个选项卡式窗格,并且有一个选项卡集合,每个选项卡中都有按钮、文本框、复选框等。我处理的所有事件都进入 MainForm.cs 文件,现在这个文件中有近 1,000 行。

有人可以给我一个简单的例子(或文章/文档)详细说明良好的结构吗?我可以在一个单独的类中定义我的 EventHandler 函数吗(如果是这样,这将如何工作......)我是否创建某种静态 Helper 类,我只需传递我需要操作的对象的实例?IE

    private void GroupBoxRequestTypeCheckedChange(object pSender, EventArgs pEventArgs)
    {
        HelperClass.HandleGroupBoxRequestTypeCheckedChanged(pSender, pEventArgs, this);
    }

'this' 是表单本身,它包含对我需要操作的对象的所有引用?

可能值得注意的是,我已经对跨线程调用有了一些了解,并且我已经开始为许多我需要的简单实例制作扩展方法。

另一个问题 - 我注意到可视化设计器默认情况下会自动将使用它创建的所有组件设为私有,将这些组件设置为内​​部组件并使用表单对象根据需要从类外部引用这些组件通常是个坏主意吗?如果这不是一个好主意,还有什么更好的方法?

4

1 回答 1

1

首先,我建议将独立的用户界面部分分成用户控件或组件。然后 - 如果需要 - 使用事件连接它们(例如,您自己的专用事件和属性。

例如,您可以将主要内容(TabControl / Container)放置在 UserControl 中,并将该用户控件放置在主窗体中。所有选项卡/页面切换逻辑/UI 等都属于该用户控件。在该 UserControl 中,您可以定义例如您自己的事件,当用户切换选项卡时触发该事件。然后主窗体可以注册到这个事件 - 就像它可以注册其他 Winforms-control-events - 并做它的事情(例如,更改窗口标题以表示当前活动的选项卡)。

然后接下来您可以将每个选项卡的内容移动到它自己的用户控件中,并在您的新选项卡用户控件中使用这些用户控件。将逻辑下移到负责给定任务的 UserControl。

一些典型应用程序的表单/控件层次结构可能如下所示:

  • 主窗体(窗体)
    • MainTabContainerControl (用户控件)
    • Page1Control(用户控件)
    • Page2Control(用户控件)
      • MyImprovedDbRowGridControl(用户控件或组件)
    • Page3Control(用户控件)
    • 边栏控件(用户控件)
    • 搜索控件(用户控件)
      • MyImprovedDbRowGridControl(用户控件或组件)
    • 快速帮助控件(用户控件)

接下来的事情就是让所有的 UI 事件处理程序尽可能小,并且只做 UI 的事情。将其他逻辑(如业务或数据访问逻辑)移至用户界面之外的其他类。

如果您在应用程序中有多次需要的控件组合:将它们移动到可重复使用的 UserControl。(例如面包屑)。

关于您的示例代码,您可以通过简化其逻辑使其更紧凑,因此可维护:

if (this.fSelectedButton.Equals(this.RadioButton_Delete))
{
    this.TextBox_DestinationFile.Enabled = false;
    this.Button_DestinationBrowse.Enabled = false;
}
else
{
    this.TextBox_DestinationFile.Enabled = true;
    this.Button_DestinationBrowse.Enabled = true;
}

...可能:

    var delete = fSelectedButton == RadioButton_Delete;
    this.TextBox_DestinationFile.Enabled = !delete;
    this.Button_DestinationBrowse.Enabled = !delete;

更新: 在重构和代码清理方面,一个非常有用的工具是Resharper (R#)。我可以强烈推荐它。

希望这能给你一些从哪里开始的想法。

于 2012-09-05T10:54:33.710 回答