2013-09-05 13 views
17

In meinem WPF-Stil habe ich eine Standard-Raster Zeilenhöhe I definiert sind, wie so zu mehreren Stellen bewerben möchten:Einstellen der RowDefinition Höhe von Static

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

aber es funktioniert nicht, wenn ich möchte dies gilt etwa so:

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

Stattdessen muss ich wie ein komplettes Stil erstellen:

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

wie man sehen kann Von der auskommentierten Zeile funktioniert auch nicht der Versuch, auf die numerische Konstante in der Style-Definition zu verweisen, sondern der "hardcoded" -Wert.

Jetzt habe ich es sieht, und ich denke, es liegt daran, dass der Typ mit der Height-Eigenschaft zugeordnet GridLength ist und es nicht schafft irgendwie nicht automatisch den doppelten Wert zu werfen, wenn sie von einer anderen Ressource comming ...

Das Problem ist, dass es keine Möglichkeit gibt, ein GridLength-Objekt aus XAML zu erstellen. Die Value-Eigenschaft ist schreibgeschützt. So etwas wie das nicht funktioniert entweder:

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

Gibt es eine Möglichkeit, diese Arbeit zu bekommen, oder soll ich nur vergessen, mit, dass konstant und benutzen Sie einfach den RowDefinition Stil mit dem fest codierten Wert anstelle der Konstante?

Antwort

23

Wenn Sie "hard-Code" Werte, die XAML-Prozessor einen Konverter sucht, die es von String in den erforderlichen Typ umwandeln kann. Sogar Ihre TableRowHeight Ressource verwendet DoubleConverter, um erstellt zu werden. GridLength verwendet .

Es gibt also keine automatische Umwandlung in den Compiler - WPF muss explizit nach einer Klasse suchen und eine Konvertierungsmethode aufrufen. Im Fall von StaticResource überspringt es diesen Schritt. obwohl

Bindungen tun Typ-Wandler verwenden, so dass die folgende würde Arbeit wie erwartet:

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

Das funktioniert, weil GridLengthConverter weiß, wie von Double zu konvertieren. In Ihrem Fall sollte dies jedoch nicht notwendig sein. Wenn Sie eine GridLength Ressource in der gleichen Art und Weise initialisieren Sie Double (innerhalb der Tags) initialisiert, wird der String-Konvertierung aufgerufen werden, bevor die Ressource zugeordnet:

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

Dann würden Sie in der Lage sein, die Ressource direkt zu nennen.

+0

Der Vorschlag mit der '{Binding Source = ...}' Syntax funktioniert! Vielen Dank! – bjavor

+0

Das Definieren des GridLength wie oben und in anderen Antworten funktioniert ebenfalls, hat aber den gleichen Nachteil, als müsste der gesamte RowDefinition-Stil mit einem fest codierten Wert definiert werden ... Sie können den Wert nicht mit dem System verknüpfen: double resource. (Zumindest habe ich keine Möglichkeit gefunden, von der Innenseite des Tags auf eine andere Ressource zu verweisen ...) Und es gibt kein "Value" -Attribut auf der GridLength ... – bjavor

+0

EDIT: Der Grund, auf den ich beharre Verknüpfung mit dem doppelten Wert, da ich diesen Wert möglicherweise in einem anderen Kontext wiederverwenden muss, der keine GridLength- oder andere spezialisierte Ressource benötigt ... – bjavor

2

Sie die Ressource von GridLength um als RowDefinition.Height Typ von GridLength Typ anwenden müssen erstellen:

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

Dies funktioniert so wie man will, sie anzuwenden.

3

Try this:

<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> 
    .... 
Verwandte Themen