2013-09-05 12 views
17

W moim stylu WPF Mam zdefiniowane standardową wysokość siatki wiersza chciałbym zastosować do kilku miejscach tak:Ustawianie RowDefinition wysokość od StaticResource

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

Jednak to nie działa, gdy chciałbym aby zastosować to tak:

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

Zamiast muszę stworzyć kompletny styl lubię:

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

jak widać z linii komentarza, która próbuje odwoływać się do stałej liczbowej w definicji stylu, również nie działa, ale ma wartość "zakodowana".

Teraz szukałem go i myślę, że to dlatego, że typ związany z właściwością wysokość GridLength i jakoś nie udaje się automatycznie rzutować podwójną wartość, gdy comming z innego źródła ...

Problem polega na tym, że nie istnieje sposób tworzenia obiektu GridLength z XAML. Proporcja wartości jest tylko do odczytu. Więc coś takiego nie działa albo:

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

Czy istnieje sposób, aby uzyskać to do pracy, czy mam po prostu zapomnieć użyciem że stała i wystarczy użyć stylu RowDefinition o wartości zakodowanego na stałe w miejscu stała?

Odpowiedz

23

Po „twardych” kod wartości, procesor XAML patrzy konwerter, który można przekształcić je z ciągiem do niezbędnego typu. Nawet twój zasób TableRowHeight używa DoubleConverter do utworzenia. GridLength używa GridLengthConverter.

Tak więc nie ma automatycznej transmisji/konwersji w kompilatorze - WPF musi jawnie wyszukać klasę i wywołać metodę konwersji. W przypadku StaticResource pominie ten krok.

Wiązania zrobić używać konwerterów typu chociaż, więc następujące by praca jak można się spodziewać:

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

To działa, ponieważ GridLengthConverter wie jak przekonwertować z Double. W twoim przypadku nie powinno to być jednak konieczne. Jeśli zainicjować GridLength zasobów w taki sam sposób zainicjowany Double (wewnątrz znaczników), konwersja ciąg zostanie wywołana przed przydzielony zasób:

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

Wtedy będzie można zadzwonić do zasobu bezpośrednio.

+0

Sugestia z użyciem składni '{Binding Source = ...}' działa! Dzięki! – bjavor

+0

Definiowanie GridLength zgodnie z powyższymi sugestiami i innymi odpowiedziami działa również, ale ma tę samą wadę, co zdefiniowanie całego stylu RowDefinition z zakodowaną wartością ... Nie można powiązać wartości z systemem: podwójny zasób. (Przynajmniej nie znalazłem sposobu, aby odnieść się do innego zasobu od środka znacznika ...) I nie ma atrybutu "Wartość" ujawnionego na GridLength ... – bjavor

+0

EDYCJA: Powód, dla którego nalegam łącząc się z podwójną wartością, ponieważ może potrzebować ponownie użyć tej wartości w innym kontekście, który nie wymaga GridLength lub innego wyspecjalizowanego zasobu ... – bjavor

2

trzeba będzie utworzyć zasób typu GridLength w celu zastosowania jako RowDefinition.Height jest typu GridLength:

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

ta będzie działać w żaden sposób chcesz go zastosować.

3

Spróbuj tego:

<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> 
    .... 
Powiązane problemy