2016-04-28 136 views
0

我想在運行時創建一個網格。這是XAML代碼來說明我所期待的:以編程方式設置ColumnDefinition和RowDefinition

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
      Name='Test'> 
    <Grid.RowDefinitions> 
     <RowDefinition Height='*' /> 
     <RowDefinition Height='*' /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
    </Grid.ColumnDefinitions> 
</Grid> 

的XAML上面的代碼是好的,除了它是靜態的,固定的。我希望應用程序在運行時根據用戶輸入創建列和行定義。所以,我創建了一個名爲啓動網格的方法:

private void initiateGrid() 
{ 
    int numberOfColumn = 10; 
    for (int j = 0; j < (numberOfColumn/5) + 1; j++) 
    { 
     RowDefinition r1 = new RowDefinition(); 
     Test.RowDefinitions.Add(r1); 
     for (int i = 0; i < numberOfColumn; i++) 
     { 
      ColumnDefinition c1 = new ColumnDefinition(); 
      c1.Width = new GridLength(1, GridUnitType.Star); 
      Test.ColumnDefinitions.Add(c1); 
      TextBlock tb = new TextBlock(); 
      tb.FontSize = 20; 
      tb.VerticalAlignment = VerticalAlignment.Top; 
      tb.HorizontalAlignment = HorizontalAlignment.Stretch; 
      tb.Text = string.Format("Text row {0}, column {1}", j, i); 
      Test.Children.Add(tb); 
      Grid.SetColumn(Test, i); 
      Grid.SetRow(Test, j); 
     } 
    } 
} 

我在MainPage中有initializeComponent之後調用它。

public MainPage() 
{ 
    this.InitializeComponent(); 
    initiateGrid(); 
} 

我沒有得到編譯器錯誤,也沒有運行時錯誤,但我沒有看到我試圖填充驗證的位置精度的文本塊。 有人可以幫我解決一些問題嗎?我的代碼出了什麼問題?

謝謝!

回答

1

這正是什麼是wron克我的代碼:

1)我創建了太多的列

2)我應該分配的行和列到的TextBlocks,而不是電網 這是正確的代碼應該是什麼:

private void initiateGrid() 
{ 
    int numberOfColumn = 10; 
     for (int i = 0; i < numberOfColumn; i++) 
     { 
      ColumnDefinition c1 = new ColumnDefinition(); 
      c1.Width = new GridLength(1, GridUnitType.Star); 
      Test.ColumnDefinitions.Add(c1); 
     } 
    for (int j = 0; j < (numberOfColumn/5) + 1; j++) 
    { 
     RowDefinition r1 = new RowDefinition(); 
     Test.RowDefinitions.Add(r1); 
     for (int i = 0; i < numberOfColumn; i++) 
     { 
      TextBlock tb = new TextBlock(); 
      tb.FontSize = 20; 
      tb.VerticalAlignment = VerticalAlignment.Top; 
      tb.HorizontalAlignment = HorizontalAlignment.Stretch; 
      tb.Text = string.Format("Text row {0}, column {1}", j, i); 
      Test.Children.Add(tb); 
      Grid.SetColumn(tb, i); 
      Grid.SetRow(tb, j); 
     } 
    } 
} 
0

這是什麼您嘗試使用AttachedProperty https://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/

實現和XAML中您只需使用像這樣一個很好的例子.....

XAML

<Grid local:GridHelpers.RowCount="{Binding RowCount}" 
      local:GridHelpers.ColumnCount="{Binding ColumnCount}" /> 

視圖模型

public MainWindowVM() 
    { 
     this.RowCount = 4; 
     this.ColumnCount = 5; 
    } 

    private int _RowCount; 

    public int RowCount 
    { 
     get { return _RowCount; } 
     set { _RowCount = value; NotifyPropertyChanged("RowCount"); } 
    } 

    private int _ColumnCount; 

    public int ColumnCount 
    { 
     get { return _ColumnCount; } 
     set { _ColumnCount = value; NotifyPropertyChanged("ColumnCount"); } 
    } 
+1

屬性與視圖有關 - 不要將它們放入VM中。 – slugster

+1

視圖可以在代碼隱藏文件中包含代碼,以便將視圖模型分配爲其DataContext屬性。這可以像視圖實例化新視圖模型並將其分配給其DataContext一樣簡單,或者使用控制反轉容器將視圖模型注入視圖。 但是,將視圖模型連接到代碼隱藏文件中的視圖是不鼓勵的,因爲它可能會給Visual Studio和Microsoft ExpressionBlend®設計軟件中的設計人員帶來問題。 – Monty

+0

那個評論是對我的回覆嗎?我很困惑 - 你究竟想說什麼?這聽起來像是來自某處的引用? – slugster