2010-09-09 22 views
17

J'ai rencontré une situation dans laquelle il serait très utile de spécifier une valeur à virgule flottante directement dans XAML et de l'utiliser comme ressource pour plusieurs de mes éléments d'interface utilisateur. Après avoir cherché autour, j'ai trouvé une bonne quantité d'informations sur la façon d'inclure le bon assembly (mscorlib) dans votre XAML afin que vous puissiez faire exactement cela.Utilisation de types de système en ressources XAML

Malheureusement, je reçois une exception dans un cas où j'essaie de le faire. Voici le XAML suivant recréant la situation:

<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> 

Lorsque je tente de compiler et exécuter, je reçois un XamlParseException jeté à moi qui dit que « 120» n'est pas une valeur valide pour la propriété « Largeur » ".

Mais la propriété "Width" est un double, alors pourquoi ne puis-je pas le définir en utilisant la StaticResource qui a été définie? Est-ce que quelqu'un sait comment faire ça?

Répondre

27

N ° ColumnDefinition.Width est de type GridLength, c'est pourquoi vous obtenez l'erreur. Si vous faites quelque chose comme le code ci-dessous, cela devrait fonctionner correctement.

<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

Merci! Ça a marché. Cela aide beaucoup. Je n'ai pas réalisé qu'il était de type GridLength. – David

3

Le problème que vous rencontrez est que sur l'objet ColumnDefinition, la propriété Width est PAS un double, il est une structure GridLength. Si vous regardez le MSDN documentation for ColumnDefinition.Width, vous verrez que vous ne pouvez pas attribuer un double à un ColumnDefinition.Width