2011-08-18 67 views
1

我在我的应用程序中实现了撤销/重做系统,但因为它是与我的主窗体不同的类,所以无法访问其任何控件。目前,我将所有需要撤消或重做的控件传递给类的构造函数,但它很快成为我项目中最大的构造函数之一。如果我只想让一个班级访问我的表单控件,该怎么办?

如果只有这个类被允许访问我的表单控件,那会很好。如果我将表单传递给构造函数,我仍然无法访问控件,因为它们都是私有的。我想这个简单的解决方案就是制作所有需要使用public的控件,但是理想或优雅的解决方案是什么?

P.S.我已经阅读过关于如何使用公共属性来获取所需的所有内容并将其传递给构造函数的技巧,但这最终会导致相当多的属性,并且此解决方案似乎不适用于此情况。

谢谢!

+0

所以你不想有一个很大的构造函数,但是你想要一个大的类/系统来知道diff表单上的一些控件来处理重做/撤销。我认为在你的设计中,问题在别的地方。如果您通过Undeo/Redo详细介绍一下您想要完成的任务,我可以为您提供帮助。 –

回答

2

将UI控件或表单传递给类是非常非常非常少见的。这只是制作中的维护/依赖性噩梦。

你不希望你的班级对你的表格的控件有所了解,所有它应该关心的是它的数据。

表单知道自己,知道需要保存的数据以及如何将其恢复到正确的控件。

如果您正在寻找的是撤销/重做功能,您需要查看Memento设计模式。除非您有其他业务需要,否则您不需要创建一个完全有资产的课程。

用于纪念图案。

一个简单的对象包含要保留状态....

internal class Memento: IMemento 
    { 
     private object _state; 

     public void SetState(object state) 
     { 
      _state = state; 
     } 

     public object GetState() 
     { 
      return _state; 
     } 
    } 

看守对象管理纪念品的形式。

public class Caretaker 
    { 
     private Dictionary<int,IMemento> _mementos = new Dictionary<int,IMemento>(); 
     public void AddMemento(int tag, IMemento memento) 
     { 
      _mementos.Add(tag, memento); 
     } 

     public IMemento GetMemento(int tag) 
     { 

      if (_mementos.ContainsKey(tag)) 
      { 
       return _mementos[tag]; 
      } 

      return null; 
     } 
    } 

该表格在更改状态后将新的纪念品保存到看守者。我们利用对象类的极端灵活性...

private void SaveMemento() 
{ 
      Memento memento = new Memento(); 
      string[] state = {TextBox1.Text, TextBox2.Text};//expand as needed 
      memento.SetState(state); 
      _caretaker.AddMemento(_currentStateIndex, memento); 
      _currentStateIndex++; 
} 

窗体根据需要恢复。

private void RevertToPreviousState() 
     { 
      Memento memento = (Memento)_caretaker.GetMemento(--_currentStateIndex); 
      string[] state = (string[]) memento.GetState(); 
      TextBox1.Text = state[0]; 
      TextBox2.Text = state[1];//expand as needed 

     } 

忘记IMemento --just标记接口,如果你想要把看守的另一装配全Memento模式实现。

public interface IMemento 
    { 
    } 
+0

感谢您的详尽回复,但我无法使用此系统。我的地图可能有数百万像素,因此为单个画笔描边保存整个画布状态将会过度。 –

+1

不打算详细说明,但您可能只想将用户作为命令对象所做的每个操作保存起来,其中包括撤消方法。查看命令模式。 – dbugger

+0

我基本上这样做,但我仍然需要对MapSizeChange类/命令中某些表单控件的引用。 –

相关问题