2016-04-28 125 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