tecnologia sintaxis propiedades otros lenguajes language introduccion application wpf xaml resourcedictionary staticresource mscorlib

wpf - sintaxis - xaml wikipedia



Usar tipos de sistema en XAML como recursos (2)

Me encontré con una situación en la que sería muy útil especificar un valor de punto flotante directamente en XAML y usarlo como recurso para varias de las piezas de mi UI. Después de buscar, encontré una buena cantidad de información sobre cómo incluir el ensamblaje adecuado (mscorlib) en su XAML para que pueda hacer eso.

Lamentablemente, recibo una excepción en una instancia en la que trato de hacer esto. Aquí está el siguiente XAML que recrea la situación:

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

Cuando intento compilar y ejecutar esto, me aparece una XamlParseException que dice que "''120'' no es un valor válido para la propiedad ''Ancho''".

Pero la propiedad "Ancho" es un doble, entonces ¿por qué no puedo configurarlo usando el StaticResource que se definió? ¿Alguien sabe como hacer esto?


El problema con el que se encuentra es que en el objeto ColumnDefinition, la propiedad Ancho no es un doble, sino una estructura GridLength. Si observa la documentación de MSDN para ColumnDefinition.Width , verá que no puede asignar un doble a ColumnDefinition.Width


No. ColumnDefinition.Width es de tipo GridLength, por lo que está obteniendo el error. Si haces algo como el siguiente código, debería funcionar bien.

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