Tengo un gran problema con la forma en que se representa XAML en tiempo de diseño frente a tiempo de ejecución. En su mayor parte, las cosas son consistentes, pero cuando uso cualquier estilo que tenga un disparador, el disparador no se comprueba en tiempo de diseño.Tiempo de diseño de WPF frente a las diferencias de estilo de ejecución con disparadores
Aquí es una aplicación de ejemplo para mostrar cómo las cosas se muestran de manera diferente:
<Window x:Class="DesignDifferencesWithDesignAndRuntime.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="400">
<Window.Resources>
<Style x:Key="multiLineInTrigger" TargetType="{x:Type TextBox}">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="150" />
<Setter Property="Height" Value="22" />
<Setter Property="BorderBrush" Value="Blue" />
<Setter Property="BorderThickness" Value="2" />
<Style.Triggers>
<Trigger Property="AcceptsReturn" Value="True">
<Setter Property="Width" Value="Auto" />
<Setter Property="Height" Value="Auto" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="VerticalAlignment" Value="Stretch" />
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="singleLineInTrigger" TargetType="{x:Type TextBox}">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="Width" Value="Auto" />
<Setter Property="Height" Value="Auto" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="BorderBrush" Value="Blue" />
<Setter Property="BorderThickness" Value="2" />
<Style.Triggers>
<Trigger Property="AcceptsReturn" Value="False">
<Setter Property="Width" Value="150" />
<Setter Property="Height" Value="22" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Center" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="HorizontalAlignment" Value="Right" />
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="Single (Single Style)" Grid.Row="0" Grid.Column="0" />
<TextBlock Text="Single (Multi Style)" Grid.Row="1" Grid.Column="0" />
<TextBlock Text="Multi (Single Style)" Grid.Row="2" Grid.Column="0" />
<TextBlock Text="Multi (Multi Style)" Grid.Row="3" Grid.Column="0" />
<TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource singleLineInTrigger}" />
<TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource multiLineInTrigger}" />
<TextBox Grid.Row="2" Grid.Column="1" Style="{StaticResource singleLineInTrigger}" AcceptsReturn="True" />
<TextBox Grid.Row="3" Grid.Column="1" Style="{StaticResource multiLineInTrigger}" AcceptsReturn="True" />
</Grid>
creé dos estilos de cuadro de texto separados que hacen el exactamente la misma cosa. Cuando TextBox es Single-Line (AcceptsReturn = False) Necesito que el ancho sea 150 y que la altura sea 22. Cuando es Multi-Line (AcceptsReturn = True, obviamente) Necesito el ancho y la altura para estirar y tomar todo el espacio
Ambos desencadenantes funcionan perfectamente en tiempo de ejecución, ya que al ejecutar este código se mostrará, pero en Design-Time no funcionan en la condición de desencadenador. Al utilizar el estilo "multiLineInTrigger", el cuadro de texto tendrá el alto y el ancho establecidos estáticamente (independientemente de AcceptsReturn), pero cuando se usa el estilo "singleLineInTrigger", los controles se extenderán independientemente del valor de Aceptar retorno.
¿Existe alguna solución para este problema? Esto se ha vuelto bastante engorroso y laborioso para el equipo de desarrollo porque no sabe cuándo funciona y cuándo no, hasta que compila y ejecuta la aplicación (que es un proceso largo).
Gracias.
¿Supone el tiempo de diseño que hace referencia a VS2010 frente a Expression Blend? –
1) Intente reconstruir la solución y verifique, esta es la primera opción. 2) Cree un CustomTextBox por subclase desde TextBox. En OnApplyTemplate aplique este estilo dentro del bloque de código DesignerProperties.GetIsInDesignMode(). Por lo tanto, este estilo se aplicará solo al modo de diseño. Use este CustomTextBox. Estás listo. –
@ Aaron, sí, esto está en Visual Studio 2010, no en la expresión. – Travis