Есть вот такой класс.
| Код | [Serializable] public class Graph { #region Private fiels [NonSerialized] private GraphDrawer _gDrawer;
private readonly List<GraphElement> _sons = new List<GraphElement>();
#endregion #region Properties public GraphDrawer Drawer { set { //if (_gDrawer == null) _gDrawer = value; } } public List<GraphElement> Sons { get { return _sons; } } #endregion #region Public methods public void AddSon(GraphElement el) { _sons.Add(el); if (_gDrawer == null) throw new Exception("gDrawer Equals null"); el.PropertyChanged += _gDrawer.Draw; _gDrawer.AddGraphElement(el); } #endregion }
|
Я запускаю его сериализацию, а он гаворит что GraphDrawer не помечен как сериализуемый.
| Код | public class GraphDrawer { #region Private fields Expect _expected = Expect.None; private readonly Panel _dPanel; Reflector reflector; private Graph _graph; private readonly Dictionary<GraphElement, ShapeControl.ShapeControl> _controls = new Dictionary<GraphElement, ShapeControl.ShapeControl>(); #endregion
#region Constructors public GraphDrawer(Panel panel) { _dPanel = panel; reflector = new Reflector(null); } #endregion #region Properties public Control PropControl { get { return reflector.Container; } set { reflector.Container = value; // Todo: What happens if user will set the same control more then one time? reflector.Container.Click += AddMouseClickHandler; } }
public Graph Graph { set { if (_graph == null) _graph = value; } } public Expect Expected { get { return _expected; } set { _expected = value; } } #endregion
#region Private methods void AddMouseClickHandler(object sender, EventArgs e) { } #endregion #region Public Methods public void Draw(object sender, PropertyChangedEventArgs args) { Graphics g = Graphics.FromHwnd(_dPanel.Handle); g.Clear(Color.GhostWhite); foreach (GraphElement el in _graph.Sons) { if (el is Edge) { /* g.FillEllipse(Brushes.YellowGreen, ((Edge)el).Left, ((Edge)el).Top, ((Edge)el).Width, ((Edge)el).Height);
g.DrawEllipse(new Pen(Color.Goldenrod, el.BorderWidth), ((Edge)el).Left, ((Edge)el).Top, ((Edge)el).Width, ((Edge)el).Height); */ } else if (el is Vertex) { Vertex v = el as Vertex; if ((v.StartEdge == null) || (v.EndEdge == null)) Console.WriteLine("Can't redraw vertex " + v.Id); else g.DrawLine(new Pen(Brushes.Black, v.BorderWidth), v.StartEdge.GetCenterPoint().X, v.StartEdge.GetCenterPoint().Y, v.EndEdge.GetCenterPoint().X, v.EndEdge.GetCenterPoint().Y); } else { Console.WriteLine("Nothing"); } } } public void AddGraphElement(GraphElement el) { if (el is Edge){ Edge edge = (Edge)el; ShapeControl.ShapeControl shape = new ShapeControl.ShapeControl(); shape.Shape = ShapeControl.ShapeType.Ellipse; shape.Width = edge.Width; shape.Height = edge.Height; shape.Left = edge.Left; shape.Top = edge.Top; shape.ForeColor = Color.Blue; shape.BorderColor = Color.Red; /*shape.Click += delegate { reflector.Extract(edge); }; shape.LocationChanged += delegate { edge.Location = new Point(shape.Left, shape.Top ); };*/ _controls.Add(edge, shape); _dPanel.Controls.Add(shape); } } #endregion }
|
|