2010-09-09 46 views
17

Napotkałem sytuację, w której byłoby bardzo użyteczne określenie wartości zmiennoprzecinkowej bezpośrednio w XAML i użycie jej jako zasobu dla kilku moich elementów UI. Po przeszukiwaniu znalazłem sporo informacji o tym, jak dołączyć odpowiedni zestaw (mscorlib) do twojego XAML, abyś mógł to zrobić.Używanie typów systemów w XAML jako zasobów

Niestety, otrzymuję wyjątek w jednym przypadku, gdy próbuję to zrobić. Oto następujące XAML, który odtwarza sytuację:

<Window x:Class="davidtestapp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:core="clr-namespace:System;assembly=mscorlib" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <core:Double x:Key="MyDouble">120</core:Double> 
</Window.Resources> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{StaticResource MyDouble}" /> 
     <ColumnDefinition Width="40" /> 
     <ColumnDefinition Width="40" /> 
    </Grid.ColumnDefinitions> 

    <Rectangle Grid.Column="0" Fill="Red" /> 
    <Rectangle Grid.Column="1" Fill="Green" /> 
    <Rectangle Grid.Column="2" Fill="Blue" /> 

</Grid> 
</Window> 

Gdy próbuję skompilować i uruchomić ten, otrzymuję XamlParseException rzucony na mnie, która mówi, że „«120»nie jest prawidłową wartością dla własności«width» ".

Ale właściwość "Szerokość" to podwójne, więc dlaczego nie mogę ustawić go za pomocą zdefiniowanego StaticResource? Czy ktoś wie, jak to zrobić?

Odpowiedz

27

Nie. ColumnDefinition.Width jest typu GridLength, dlatego pojawia się błąd. Jeśli zrobisz coś takiego jak poniższy kod, powinno to działać poprawnie.

<Window.Resources> 
    <core:Double x:Key="MyDouble">300</core:Double> 
    <GridLength x:Key="MyGridLength">20</GridLength> 
</Window.Resources> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{StaticResource MyGridLength}" /> 
     <ColumnDefinition Width="40" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 

    <Rectangle Grid.Column="0" Fill="Red" /> 
    <Rectangle Grid.Column="1" Fill="Green" /> 
    <Rectangle Grid.Column="2" Fill="Blue" Width="{StaticResource MyDouble}"/> 

</Grid> 
+0

Dzięki! Zadziałało. To bardzo pomaga. Nie zdawałem sobie sprawy, że był to typ GridLength. – David

3

Problem napotkania jest to, że na obiekcie ColumnDefinition, właściwość Width jest NIE podwójne, jest to struktura GridLength. Jeśli spojrzysz na MSDN documentation for ColumnDefinition.Width zobaczysz, że nie możesz przypisać podwójnego do ColumnDefinition.Width