Sto riscontrando un grosso problema con il rendering di XAML in fase di progettazione in fase di esecuzione. Per la maggior parte, le cose sono coerenti, ma quando uso uno qualsiasi degli stili che hanno un Trigger, il trigger non viene controllato in Design-Time.WPF Design-Time vs Differenze di stile run-time con trigger
Ecco un'applicazione di esempio per mostrare come le cose vengono visualizzati in modo diverso:
<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>
ho creato due stili TextBox separati che fanno la stessa identica cosa. Quando il TextBox è Single-Line (AcceptsReturn = False) ho bisogno che la larghezza sia 150 e l'altezza sia 22. Quando è Multi-Line (AcceptsReturn = True, ovviamente) Ho bisogno della larghezza e dell'altezza per allungare e prendere su tutto lo spazio.
Entrambi questi trigger funzionano perfettamente in Run-Time, poiché l'esecuzione di questo codice mostrerà, ma in Design-Time entrambi non riescono a lavorare sulla condizione di trigger. Quando si utilizza lo stile "multiLineInTrigger", la casella di testo avrà l'altezza e la larghezza impostate staticamente (indipendentemente da AcceptsReturn), ma quando si utilizza lo stile "singleLineInTrigger", i controlli verranno allungati indipendentemente dal valore AcceptsReturn.
Esiste una soluzione per questo problema? Questo è diventato piuttosto fastidioso e dispendioso in termini di tempo per il team di sviluppo perché non sanno quando funziona o quando non lo è fino alla compilazione e all'esecuzione dell'applicazione (che è un processo lungo).
Grazie.
Ipotesi di progettazione si sta riferendo VS2010 versus Expression Blend? –
1) Prova a ricostruire la soluzione e verifica, questa è la prima opzione. 2) Creare un CustomTextBox sottoclassandolo da TextBox. In OnApplyTemplate applicare questo stile all'interno del blocco di codice DesignerProperties.GetIsInDesignMode(). Quindi, questo stile verrà applicato da solo alla modalità di progettazione. Usa questo CustomTextBox. Hai fatto. –
@'Aaron, Sì, è in Visual Studio 2010, non è un'espressione. – Travis