2017-10-18 60 views
-1

我是新來的編程和學習C#試圖在WPF中創建一個Sudoku遊戲。此刻,試圖通過使用一個採用行和列座標的Position方法來顯示TextBlock(構成每個單元格的控件)信息。在wpf中創建對象時,爲什麼要循環回到MainWindow?

但是,當啓動代碼時,MessageBox.Show()命令從不執行。通過它似乎只要它嘗試創建Grid對象,它立即跳回到公共MainWindow()行,結果MessageBox命令從不發生。我懷疑的一點是它與從MainWindow繼承的Grid.cs有關,但我認爲這是適當的,所以我可以引用xaml對象。還有什麼可能導致這個循環?

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();       
     } 
    } 
} 

此外,運行代碼似乎導致一些快速的垃圾收集,這是我無法理解: https://i.imgur.com/9bXuezQ.png

回答

0

當創建Grid時,它繼承自MainWindow,它似乎再次調用它並導致循環,直到出現堆棧溢出。相反,請刪除Grid.cs中的繼承,並通過構造函數Grid傳遞GameGrid。 (很多 「網格」 的事情要小心明確的引用錯誤的!)

MainWindow.xaml.cs:

var Grid = new Grid(GameGrid); 

Grid.cs:

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

此外,快速垃圾收集只是一遍又一遍地創建相同數據的程序。

+0

如果我要在其他非MainWindow類中引用xaml對象,我是否還需要通過via方法傳遞相關對象?這可能是一個涉及到的問題,需要更多的信息;我只想知道我的選擇範圍。 –

+0

您可以使這些對象在MainWindow.xaml.cs中公開或保護,然後通過使用MainWindow.ObjectName直接從Grid引用它們。 – mattshu