2017-10-18 4 views
-1

Je suis nouveau dans la programmation et l'apprentissage de C# en essayant de créer un jeu de Sudoku dans WPF. À l'heure actuelle, essayez de voir si je peux afficher TextBlock (le contrôle qui compose chaque cellule) des informations en utilisant une méthode de Position qui prend des coordonnées de ligne et de colonne.Pourquoi suis-je en boucle sur MainWindow lors de la création d'un objet dans wpf?

Toutefois, la commande MessageBox.Show() ne s'exécute jamais lorsque je lance le code. Il semble que, dès qu'il essaie de créer l'objet Grid, il revient immédiatement à la ligne publique MainWindow(), et par conséquent la commande MessageBox ne se produit jamais. Un de mes soupçons est que cela a à voir avec Grid.cs héritant de MainWindow, mais j'ai pensé que c'était approprié afin que je puisse référencer les objets xaml. Quoi d'autre pourrait causer cette boucle?

MainWindow.xaml.cs:

using System.Windows; 

namespace Sudoku 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    {   
     public MainWindow() 
     {    
      InitializeComponent(); 
      InitializeGame(); 
     } 

     private void InitializeGame() 
     { 
      var Grid = new Grid(); 
      MessageBox.Show(Grid.Position(2, 5).Name); 
     } 
    } 
} 

Grid.cs:

using System.Windows.Controls; 

namespace Sudoku 
{  
    public class Grid : MainWindow 
    {   
     /// Returns a TextBlock cell object at a specified row and column coordinate. 
     public TextBlock Position(int row, int column) 
     { 
      return GameGrid.Children 
         .Cast<TextBlock>() 
         .Where(e => System.Windows.Controls.Grid.GetRow(e) == row && System.Windows.Controls.Grid.GetColumn(e) == column) 
         .Single();       
     } 
    } 
} 

En outre, l'exécution du code semble causer une collecte des ordures rapide, que je ne comprends pas: https://i.imgur.com/9bXuezQ.png

Répondre

0

Lorsque Grid est créé, il hérite de MainWindow, qui semble l'appeler de nouveau et de provoquer une boucle jusqu'à ce qu'un débordement de pile. Au lieu de cela, supprimez l'héritage dans Grid.cs et passez GameGrid via le constructeur Grid. (Beaucoup de "Grid" en cours Méfiez-vous des erreurs de référence ambiguës!)

MainWindow.xaml.cs:

var Grid = new Grid(GameGrid); 

Grid.cs:

public Grid GameGrid; 
public Grid (Grid g) 
{ 
    GameGrid = g; 
} 

En outre, la rapide garbage collection est juste le programme qui crée les mêmes données encore et encore.

+0

Si je dois référencer des objets xaml dans d'autres classes non MainWindow, dois-je également passer les objets pertinents dans les méthodes via? Il est possible qu'il s'agisse d'une question complexe nécessitant plus d'informations. Je veux juste savoir quelle est la portée de mes options. –

+0

Vous pouvez rendre ces objets publics ou protégés dans MainWindow.xaml.cs, puis les référencer directement depuis Grid à l'aide de MainWindow.ObjectName. – mattshu