2011-08-31 60 views
11

當你創建XAML中網格可以定義RowDefinitions這樣指定RowDefinition.Height代碼

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
</Grid> 

我有必要做同樣的事情在代碼。我知道我可以寫

RowDefinition row = new RowDefinition(); 
row.Height = new GridLength(1.0, GridUnitType.Star); 

但是這並不能幫助我很多,因爲我有進來的字符串。我大概可以創建自己的「字符串GridLength」轉換器,但是這個感覺不對,因爲它從xaml運行得非常順利。當然,我試過以下但它不起作用

row.Height = new GridLength("*"); 

我在這裏錯過了什麼?

回答

13

GridLength結構有限定的TypeConverter XAML中實例化時正在被使用。你也可以在代碼中使用它。它被稱爲GridLengthConverter

如果你看看GridLength.cs與反射它看起來像這樣。注意TypeConverter

[StructLayout(LayoutKind.Sequential), TypeConverter(typeof(GridLengthConverter))] 
public struct GridLength : IEquatable<GridLength> 
{ 
    //... 
} 

您可以使用它像

GridLengthConverter gridLengthConverter = new GridLengthConverter(); 
row.Height = (GridLength)gridLengthConverter.ConvertFrom("*"); 
9

無需創建一個轉換器,已經有一個,這是正在使用XAML的解析器,以及:

var converter = new GridLengthConverter(); 
row.Height = (GridLength)converter.ConvertFromString("*"); 

在一個旁註,你會發現這樣的轉換器很多類型,因爲許多從XAML中的字符串解析,例如BrushConverter & ImageSourceConverter

+0

謝謝,從來沒有聽說過類型轉換器。不得不選擇一個答案,你沒有編譯,因爲GridLength不是空的,所以..感謝其他轉換器的提示以及 – Andy

+0

@Andy:Tss,該死的結構... –

7

你缺少包括您RowDefinition到RowDefinitions

RowDefinition row = new RowDefinition(); 
row.Height = new GridLength(1.0, GridUnitType.Star); 
YourGrid.RowDefinitions.Add(row); 

見你! Rutx