WPF,app失去了创建或操作GUI对象的能力

时间:2013-12-06 17:45:06

标签: wpf c#-4.0

我需要一些WPF的帮助

我开始使用WPF并希望使用以下类进行简单的蛇游戏:


GameBoard : Window
{
  private Game game;

  public GameBoard(){ this.game = new Game(this); }

  public Rectangle rectangleFactory(int x, int y)
  { 
    Rectangle rect = new Rectangle();
    rect.Width = 10;
    rect.Height = 10;
    GameArea.Children.Add(rect); /// My Canvas is called GameArea
    Canvas.SetLeft(rect, 10 * x);
    Canvas.SetTop(rect, 10 * y);
    return rect;
}

  public void rectangleBin(Rectangle)
  {
    GameArea.Children.Remove(rect);
  }
}

Thing{
  private GameBoard Board;
  private System.Windows.Shapes.Rectangle rect;
  private int[] coordinaters;

  public Thing(GameBoard board, int[] coordinates)
  { 
    this.Board = board; 
    Draw();
  }

  public Draw(){ rect = Board.rectangleFactory(coordinates);}
  public Dispose(){ Board.rectangleBin(rect)}
}

SnakeSegment : Thing 
{
  SnakeSegment next;
  public SnakeSegment(GameBoard board, int[] coordinates) : base(board, coordinates) { } 
}

Apple : Thing()
{
  public Apple(GameBoard board, int[] coordinates) : base(board, coordinates) { }

  public void newApple()
  {
    Dispose();
    getNewCoordinate();
    Draw();
  }
}

Game
{
  private GameBoard Board;
  private Apple apple;
  Private Snake snake;
  private static System.timers.timer timer

  public Game(GameBoard board)
  {
    this.Board = board;
    this.apple = new Apple(board, int start_coordinates);
    this.snake = new snake(this);
    this.timer = new Timer(100);
    timer.Elapsed += new ElapsedEventHandler(update_game);
  }

  public void update_game(object o, ElapsedEventArgs s){ snake.move_forward(); }
}


Snake
{
  private SnakeSegmet Head;
  Private SnakeSegment Tail
  private GameBoard Board;

  public Snake(Game game)
  {
    this.Board = game.Board;
    this.Head = new SnakeSegment(Board, start_cooridantse)
    this.Tail = Head;
  }

  private void AddSegment()
  {
    Head.Next = new SnakeSegment(Board, newCoordinates);
    Head = Head.Next;
  }
}

当然还有更多,但为了便于阅读,我把它留了下来。

当我开始游戏时,它会绘制游戏区域并为蛇添加一个苹果和一个初始矩形,到目前为止一直很好

但随后我更新游戏,事情就变成了南方 我在Head.Next = new SnakeSegment()中对SnakeSegment构造函数的下一次调用 调用new Rectangle()

时以rectangleFactory结尾

程序不会崩溃,但它会推翻当前堆栈,并且在定时器引发其他事件时不会执行任何其他操作

香港专业教育学院尝试排除故障并重新路由流程,如果我改为调用Apple :: newApple(),当我到达GameArea.Children.Remove(rect);时会发生同样的事情

我是WPF的新手,这让我很头疼,如果有人能解释为什么会发生这种情况,我将非常感激。

此致,托比亚斯

1 个答案:

答案 0 :(得分:3)

如果你想编写你的程序,请使用WinForms。如果你想使用WPF,你需要从头开始重新开始。 WPF是一种以数据为中心的语言......我们操纵数据对象,而不是UI对象。

使用WPF,您需要将游戏对象视为数据对象的集合。然后,该板将是您将数据绑定到的集合的UI容器控件。然后,您将在XAML中的DataTemplate中定义每个对象的外观。在将数据对象的位置属性绑定到UI对象的位置属性之后,您可以通过从代码更改数据对象的位置属性来移动UI中的​​对象。

说了这么多,我认为你会发现WPF不是制作游戏的好框架。它的主要优势在于其数据绑定功能和丰富的UI可能性,但效率不高。你需要一块好的显卡才能充分利用它。