单身或静态课程或两者都不是?

时间:2016-01-19 17:42:07

标签: c# winforms

我正在创建一个Windows Form应用程序,它基本上是一种油漆的再创造。我有一个各种按钮的工具条,我能够将一个位图的副本拖到图表上,并将其放在绘图面板上。但是我想添加能够在面板周围移动位图的功能,并使用角落和线条中间的9个节点重新调整大小。

目前我的表单有

    List<Diagram> theDiagrams; 

包含自定义图表对象的列表。每个图表代表绘图面板上的位图,它具有坐标,大小,z-index,位图和一些其他信息。但是现在我只希望只有具有焦点的Diagram能够被编辑,或者让外围的9个节点能够移动/重新调整大小。我正在考虑创建一个类,它是我目前拥有的Diagram类的派生,但我只想创建其中的一个。我应该创建静态类还是使用单例设计模式来确保一次只能创建其中一个对象。理想情况下,我希望这个类从一开始就是null,并且只在必要时才设置为图表的副本。

我不太想弄清楚如何为这个特定场景设计类,所以我认为不需要太多代码来获得我所说的内容。但是,如果你觉得你需要一些我正在谈论的例子,我很乐意分享这些代码,以确保我能找到最好的解决方案。

如果你不理解我的问题,我应该使用单身设计模式,静态类,还是我想要完成的事情?

1 个答案:

答案 0 :(得分:2)

在这种情况下,我会避免静态和单例模式。如果您有多个表单(MDI应用程序)

,该怎么办?

选定的位图/图层类似于图像/表单的属性,没有任何模块或类可以直接更改它。您的图片类控制着List<Diagram>

我认为您应该有一个private Diagram selectedDiagram;字段,其中包含在包含List<Diagram> theDiagrams字段的同一控件/表单中定义的当前所选图表。

绘制完整列表时,应跳过选定的列表并将其绘制为最后一个图表。 (所以它会是最顶层的)

只是一个想法......

<强>伪

private void UpdateBitmap()
{
    foreach(var diagram in theDiagrams)
    {
        if(diagram == selectedDiagram)
            continue;

        // draw
    }

    if(selectedDiagram != null)
    {
        // draw with corner nodes and/or other helper controls (z-top)

        // does the corner nodes and/or other helper controls exists?
        if(!areEditControlsCreated)
             CreateEditControls();

    }
    else
    {
        if(areEditControlsCreated)
             DestroyEditControls();

    }
}

当您取消选择图表时,只需清除selectDiagram = null;字段并重新绘制位图。