2013-09-05 10 views
17

Nel mio stile di WPF ho definito un'altezza di riga di tabelle standard vorrei applicare a diversi luoghi in questo modo:Impostazione dell'altezza RowDefinition da StaticResource

<system:Double x:Key="TableRowHeight">22</system:Double> 

Tuttavia non funziona quando mi piacerebbe di applicare questo modo:

<RowDefinition Height="{StaticResource TableRowHeight}"/> 

Invece ho bisogno di creare uno stile completa come:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}"> 
    <!--<Setter Property="Height" Value="{StaticResource TableRowHeight}"/>--> 
    <Setter Property="Height" Value="22"/> 
</Style> 

come si può vedere dalla riga commentata cercando di fare riferimento alla costante numerica all'interno della definizione di stile non funziona neanche, ma il valore "hardcoded" lo fa.

Ora ho guardato in su e credo che sia perché il tipo associato con la proprietà Height è GridLength e in qualche modo non riesce a lanciare automaticamente il doppio valore quando ritornassi da un'altra risorsa ...

Il problema è che non sembra esserci un modo per creare un oggetto GridLength da XAML. Il valore propery è readonly. Quindi, qualcosa come questo non funziona neanche:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}"> 
    <Setter Property="Height"> 
     <Setter.Value> 
      <GridLength Value="{StaticResource TableRowHeight}"/> 
     </Setter.Value> 
    </Setter> 
</Style> 

C'è un modo per ottenere questo lavoro, o devo solo dimenticare usando quel costante e basta usare lo stile RowDefinition con il valore hardcoded al posto della costante?

risposta

23

Quando i valori "duri codice", il processore XAML guarda in alto un convertitore che può convertire da stringa al tipo necessario. Anche la tua risorsa TableRowHeight utilizza DoubleConverter per essere creata. GridLength utilizza GridLengthConverter.

Quindi non c'è alcuna conversione/conversione automatica nel compilatore - WPF deve cercare esplicitamente una classe e chiamare un metodo di conversione. Nel caso di StaticResource, salta questo passaggio.

Associazioni fanno utilizzare convertitori di tipi, però, quindi il seguente sarebbe funzionare come previsto:

<RowDefinition Height="{Binding Source={StaticResource TableRowHeight}}" /> 

Questo funziona perché GridLengthConverter sa come convertire da Double. Nel tuo caso, questo non dovrebbe essere necessario, però. Se si inizializza una risorsa GridLength nello stesso modo è stata inizializzata Double (all'interno dei tag), la conversione stringa verrà chiamato prima si assegna la risorsa:

<GridLength x:Key="TableRowHeight">22</GridLength> 

allora si sarebbe in grado di chiamare direttamente la risorsa.

+0

Il suggerimento con l'uso della sintassi '{Binding Source = ...}' funziona! Grazie! – bjavor

+0

La definizione di GridLength come suggerito sopra e in altre risposte funziona pure, ma ha lo stesso inconveniente di dover definire l'intero stile di RowDefinition con un valore codificato ... Non è possibile collegare il valore al sistema: doppia risorsa. (Almeno non ho trovato un modo per fare riferimento a un'altra risorsa dall'interno del tag ...) E non c'è alcun attributo "Valore" esposto su GridLength ... – bjavor

+0

EDIT: Il motivo per cui insisto collegamento al doppio valore, poiché potrebbe essere necessario riutilizzare tale valore in qualche altro contesto, che non richiede una GridLength o un'altra risorsa specializzata ... – bjavor

2

si dovrà creare la risorsa di tipo GridLength al fine di applicare come RowDefinition.Height è di tipo GridLength:

<window:GridLength x:Key="TableRowHeight">50</window:GridLength> 

Ciò funzionerà in ogni caso si desidera applicarlo.

3

Prova questo:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     xmlns:t="clr-namespace:System.Windows;assembly=PresentationFramework"> 
    <Window.Resources> 
     <t:GridLength x:Key="gridHeight">50</t:GridLength> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="{StaticResource gridHeight}"></RowDefinition> 
     </Grid.RowDefinitions> 
    .... 
Problemi correlati