2012-02-27 35 views
12

如何以编程方式构建这片XAML?在后面的代码中应用网格星形大小

<Grid Name="gridMarkets"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="10" /> 
     <RowDefinition Height="*" MinHeight="16" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="10" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
</Grid> 

它是动态解析和构造控件的优雅解决方案吗?

我试图做一些事情:

RowDefinition newRow = new RowDefinition(); 
newRow.Height = new GridLength(10); 
newGrid.RowDefinitions.Add(newRow); 

但我怎么分配*标志?

寻找对这个问题的任何想法! 谢谢!

+0

可能重复[网格星大小在后面的代码(http://stackoverflow.com/questions/5459595/grid-star-size-in -code-behind) – 2012-02-28 01:32:37

回答

30

可以使用Grid.Star单位类型

newRow.Height = new GridLength(1, GridUnitType.Star); 

您还可以使用XamlReader对象XAML字符串转换成从代码隐藏UI对象,虽然我平时比较喜欢手动创建就像你如何创建对象他们。

+0

谢谢!但为什么它是1?不是零? – 2012-02-27 14:35:48

+0

如果你想要一颗星,那么你需要指定你想要一颗星,而不是零。如果您不知道,也可以在XAML中使用多个明星:例如'高度= “2 *”'。 – svick 2012-02-27 14:40:00

+3

@WildGoat使用'Height =“*”时,默认单位为1.这意味着该行与所有其他星号大小的行将占用相等的空间量。例如,如果您有两行都具有'Height =“*”',则两行将占用相等的空间量。如果第一行有'Height =“2 *”',那么它将是第二行大小的两倍。如果Row1具有'Height =“2 *”'且Row2具有'Height =“3 *”',那么第一行将占用2/5的可用空间,第二行将占用3/5。 – Rachel 2012-02-27 14:56:23

7

下面是一些例子:

grid.RowDefinitions.Add(new RowDefinition {Height = new GridLength(10)}); 
grid.RowDefinitions.Add(new RowDefinition {Height = new GridLength(1, GridUnitType.Star), MinHeight = 16}); 

grid.RowDefinitions.Add(new RowDefinition {Height = new GridLength(1, GridUnitType.Star)}); 
grid.RowDefinitions.Add(new RowDefinition {Height = GridLength.Auto}); 

,类似的还有列。

5

使用GridLength构造函数,可以指定GridUnitType,正如其他人所建议的,这里是正确的方法。

但是,如果由于某种原因,你想字符串值它在XAML同样这样做实际上转化为正确的类型,你也可以这样做:

看那GridLength类型:它定义TypeConverter属性与参数typeof(GridLengthConverter)。这意味着您可以使用该类型来执行转换:

new GridLengthConverter().ConvertFromString("*") 
+0

适用于WPF,但不适用于UWP或WinRT – 2018-03-05 12:41:04