2011-01-04 11 views
7

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.

+0

¿Supone el tiempo de diseño que hace referencia a VS2010 frente a Expression Blend? –

+1

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

+0

@ Aaron, sí, esto está en Visual Studio 2010, no en la expresión. – Travis

Respuesta

5

He visto este problema muchas veces y nunca he visto una solución para esto, Triggers no funciona en Visual Studio 2010 Designer. Con suerte, pueden arreglar esto pronto.

La única solución que se me ocurre es hacer el trabajo de diseño en Expression Blend 4 en su lugar, donde esto funciona perfectamente. Puede que no sea lo ideal, pero por el momento no creo que tenga otra opción

+0

Temía que ese fuera el caso. Gracias por la información, revisaré la mezcla de expresiones y veré si es una solución mientras tanto. – Travis

Cuestiones relacionadas