原来的代码全部删除,进行了深层次重构,得其意而忘其言。得意之处有二:
1.关于显示
以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize * 19;以此来控制棋盘大小。所有的对象在 Init() 方法中创建,而具体的渲染在 Redraw() 方法中完成。这种创建与重绘相分开的办法,使调整大小时进行重绘更简单易行。这两个方法的代码如下:
1 void Init() 2 { 3 // 线 4 for (int i = 0; i < 19; i++) { 5 m_LinesH[i] = new Line(); 6 m_LinesH[i].Stroke = Brushes.Black; 7 m_Canvas.Children.Add(m_LinesH[i]); 8 9 m_LinesV[i] = new Line(); 10 m_LinesV[i].Stroke = Brushes.Black; 11 m_Canvas.Children.Add(m_LinesV[i]); 12 } 13 14 // 星 15 for (int j = 0; j < 3; j++) { 16 for (int i = 0; i < 3; i++) { 17 m_Stars[i, j] = new Ellipse(); 18 m_Stars[i, j].Fill = Brushes.Black; 19 m_Canvas.Children.Add(m_Stars[i, j]); 20 } 21 } 22 23 for (int i = 0; i < 19; i++) { 24 for (int j = 0; j < 19; j++) { 25 m_Stones[i, j] = new Ellipse(); 26 m_Stones[i, j].Visibility = Visibility.Hidden; 27 m_Canvas.Children.Add(m_Stones[i, j]); 28 29 m_Numbers[i, j] = new TextBlock(); 30 m_Numbers[i, j].Background = Brushes.Transparent; 31 m_Numbers[i, j].Visibility = Visibility.Hidden; 32 m_Canvas.Children.Add(m_Numbers[i, j]); 33 34 m_Steps[i, j] = new Step(); 35 m_Steps[i, j].Row = i; 36 m_Steps[i, j].Col = j; 37 m_EmptySteps.Add(m_Steps[i, j]); 38 m_AllSteps.Add(m_Steps[i, j]); 39 } 40 } 41 42 // 当前标志 43 m_CurrentRect.Visibility = System.Windows.Visibility.Hidden; 44 m_CurrentRect.Fill = Brushes.Red; 45 m_Canvas.Children.Add(m_CurrentRect); 46 47 for (int i = 0; i < 19; i++) { 48 for (int j = 0; j < 19; j++) { 49 Rectangle rect = new Rectangle(); 50 rect.Visibility = System.Windows.Visibility.Hidden; 51 m_EmptyRects[i, j] = rect; 52 m_Canvas.Children.Add(m_EmptyRects[i,j]); 53 54 } 55 } 56 }