c# - Configuración de la altura de definición de fila desde StaticResource
wpf (3)
Cuando los valores de "código duro", el procesador XAML busca un convertidor que puede convertirlo de una cadena al tipo necesario. Incluso su recurso TableRowHeight
está utilizando DoubleConverter para ser creado. GridLength
utiliza GridLengthConverter .
Por lo tanto, no hay conversión / conversión automática en el compilador: WPF necesita buscar explícitamente una clase y llamar a un método de conversión. En el caso de StaticResource
, omite este paso.
Sin embargo, los enlaces utilizan convertidores de tipo, por lo que lo siguiente funcionaría como espera:
<RowDefinition Height="{Binding Source={StaticResource TableRowHeight}}" />
Esto funciona porque GridLengthConverter
sabe cómo convertir de Double
. En tu caso, esto no debería ser necesario, sin embargo. Si inicializa un recurso GridLength
de la misma manera que inicializó Double
(dentro de las etiquetas), se llamará a la conversión de cadena antes de que se asigne el recurso:
<GridLength x:Key="TableRowHeight">22</GridLength>
Entonces podrás llamar directamente al recurso.
En mi estilo WPF, he definido un alto de fila de cuadrícula estándar que me gustaría aplicar a varios lugares, como por ejemplo:
<system:Double x:Key="TableRowHeight">22</system:Double>
Sin embargo, no funciona cuando me gustaría aplicar esto así:
<RowDefinition Height="{StaticResource TableRowHeight}"/>
En su lugar necesito crear un estilo completo como:
<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
<!--<Setter Property="Height" Value="{StaticResource TableRowHeight}"/>-->
<Setter Property="Height" Value="22"/>
</Style>
Como puede verse en la línea comentada, tratar de hacer referencia a la constante numérica dentro de la definición de Estilo tampoco funciona, pero el valor "codificado" sí lo hace.
Ahora lo he buscado y supongo que es porque el tipo asociado con la propiedad Height es GridLength y de alguna manera no logra convertir automáticamente el valor doble cuando proviene de otro recurso ...
El problema es que no parece haber una forma de crear un objeto GridLength desde XAML. El valor de la propiedad es de solo lectura. Así que algo como esto tampoco funciona:
<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
<Setter Property="Height">
<Setter.Value>
<GridLength Value="{StaticResource TableRowHeight}"/>
</Setter.Value>
</Setter>
</Style>
¿Hay alguna manera de hacer que esto funcione, o debería olvidarme de usar esa constante y simplemente usar el estilo RowDefinition con el valor codificado en lugar de la constante?
Prueba esto:
<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>
....
Tendrá que crear el recurso de tipo GridLength
para aplicar como RowDefinition.Height
es de tipo GridLength
:
<window:GridLength x:Key="TableRowHeight">50</window:GridLength>
Esto funcionará de cualquier manera que quieras aplicarlo.