2011-08-31 7 views
11

Quando si crea una griglia in XAML è possibile definire le RowDefinitions come taleSpecifica RowDefinition.Height nel codice

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

Ho un bisogno di fare la stessa cosa nel codice. So che posso scrivere

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

ma questo non mi aiuta molto in quanto ho una stringa in arrivo. Probabilmente potrei creare il mio "stringa GridLength" convertitore, ma questo non mi sembra giusto in quanto funziona sempre così liscio da xaml. Certo, ho provato quanto segue ma non funziona

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

Cosa mi manca qui?

risposta

13

Il GridLength struttura ha un TypeConverter definito che viene utilizzato quando un'istanza da Xaml. Puoi usarlo anche nel codice. Si chiama

Se si guarda GridLength.cs con Reflector, appare come questo. Si noti la TypeConverter

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

è possibile utilizzarlo come

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

Non c'è bisogno di creare un convertitore, c'è già uno, che viene utilizzato dal XAML-parser così:

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

Su un sidenote, troverete convertitori come questo per molto di tipi, come molti vengono analizzati dalle stringhe in XAML, ad es BrushConverter & ImageSourceConverter

+0

Grazie, mai sentito parlare di Convertitori di tipi prima. Ho dovuto scegliere una risposta e il tuo non ha compilato poiché GridLength non è annullabile quindi .. Grazie per la punta degli altri convertitori pure – Andy

+0

@Andy: Tss, maledette strutture ... –

7

vi manca di includere il tuo RowDefinition a RowDefinitions

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

che si vede! Rutx