2014-02-08 84 views
0

我一直在環顧四周,但我一直無法找到任何東西。我正在嘗試使用Visual Studio 2013 Pro在C#中開始製作Windows 8.1應用程序。我希望能夠訪問數組中的多個元素(特別是按鈕或文本塊),因爲這對於開發諸如棋盤遊戲之類的東西更方便。舉例來說,如果我正在開發井字棋,我可能會使用這樣的一系列的按鈕:我可以在代碼隱藏中訪問數組中的XAML元素嗎?

<Grid> 
    <Button Name="Cell00"/> 
    <Button Name="Cell01"/> 
    <Button Name="Cell02"/> 
    <Button Name="Cell10"/> 
    <Button Name="Cell11"/> 
    <Button Name="Cell12"/> 
    <Button Name="Cell20"/> 
    <Button Name="Cell21"/> 
    <Button Name="Cell22"/> 
<Grid/> 

現在對於將檢查一個雙贏的功能,我會檢查像所有可能的組合這是在後面的代碼:

private bool CheckForWin() 
{ 
    if((Cell00 == Cell01) && (Cell01 == Cell02) && isNotBlank(Cell02)) return true; 
    if((Cell10 == Cell11) && (Cell11 == Cell12) && isNotBlank(Cell12)) return true 
    ... 
    return false; //if none of the win conditions pass 
} 

這種類型的代碼將是非常麻煩的。我想寫它,而不是讓我用for循環檢查數組。

我意識到,用井字遊戲,使用蠻力代碼它是相當容易的,但這是我頭上的第一個例子。像Reversi或Go這樣的其他遊戲不會像這樣工作得很好,因爲它的尺寸很大,或者放置的棋子可以改變放置其他單元格的事實。

任何幫助,這將不勝感激。

回答

0

這很可能。簡單地聲明數組變量:

private Button[] _buttonArray; 

填充陣列一次,也許在構造函數:

_buttonArray = new[] {Cell00, Cell01, .... , Cell22}; 

而且所有的按鈕,現在通過_buttonArray訪問。

1

這不是使用WPF的正確方法。 WPF旨在使用數據綁定....直接創建和操作UI元素是不好的形式。關於這個的帖子/討論/問題比你想象的要多,我會讓你自己去研究它們。在平均時間,這是你如何使用WPF「正常」:

首先使用的NuGet到MVVM精簡版添加到您的項目,以便得到ViewModelBase類和單細胞創建一個視圖模型:

public class Cell : ViewModelBase 
{ 
    private string _Text; 
    public string Text 
    { 
     get { return _Text; } 
     set { _Text = value; RaisePropertyChanged(() => this.Text); } 
    } 
} 

一個層次了,你會希望有一個主模型封裝的這些數組,這就是你通常會做你所有的遊戲邏輯:

public class MainModel : ViewModelBase 
{ 
    private ObservableCollection<Cell> _Cells; 
    public ObservableCollection<Cell> Cells 
    { 
     get { return _Cells; } 
     set { _Cells = value; RaisePropertyChanged(() => this.Cells); } 
    } 

    public MainModel() 
    { 
     this.Cells = new ObservableCollection<Cell>(
      Enumerable.Range(1, 100) 
       .Select(i => new Cell { Text = i.ToString() }) 
     ); 
    } 
} 

請注意,所有我此刻做的是創造一個100個元素的細胞集合。這主要視圖模型變成您分配給窗口的數據上下文的一個:

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new MainModel(); 
} 

現在你的XAML控件需要綁定到這個數據。 ItemsControl用於渲染元素的集合,以便使用其中一個元素並將其綁定到您的數組。您希望它們以2D網格顯示,因此請用WrapPanel替換ItemsPanelTemplate。最後補充一個DataTemplate你Cell類,使一個按鈕被繪製每個單元:

<Window.Resources> 
    <DataTemplate DataType="{x:Type local:Cell}"> 
     <Button Width="32" Height="32" Content="{Binding Text}"/> 
    </DataTemplate> 
</Window.Resources> 

<ItemsControl ItemsSource="{Binding Cells}" Width="320" Height="320" HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

這就是你如何使用WPF。您的邏輯完全存儲在視圖模型中,並且完全與視圖分離。下面是這個特定的代碼顯示的內容,它應該是非常明顯的,這個代碼是多麼靈活且易於更改:

enter image description here

相關問題