2011-01-04 21 views
7

デザインタイムとランタイムでのXAMLのレンダリングに大きな問題があります。ほとんどの場合、ものは一貫していますが、トリガーを持つスタイルを使用すると、トリガーはデザイン時にチェックされません。ここでWPFデザイン時と実行時スタイルとトリガとの違い

は、物事が異なって表示される方法を示すためのサンプル・アプリケーションです:

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

私はまったく同じことを行う二つの別々のTextBoxスタイルを作成しました。 TextBoxがシングルラインの場合(AcceptsReturn = False)、幅が150、高さが22である必要があります。マルチライン(AcceptsReturn = True、明らかに)の場合は、ストレッチとテイクの幅と高さが必要です全体のスペースを増やす。

このコードは実行時に実行時に完全に動作しますが、デザインタイムでは両方ともトリガ条件で動作しません。 "multiLineInTrigger"スタイルを使用する場合、テキストボックスの高さと幅は(AcceptsReturnに関係なく)静的に設定されますが、 "singleLineInTrigger"スタイルを使用すると、AcceptsReturn値に関係なくコントロールが引き伸ばされます。

この問題の解決策はありますか?これは、アプリケーションのコンパイルと実行(長いプロセス)までではなく、いつ動作しているのか分からないため、開発チームにとって非常に面倒で時間がかかるようになっています。

ありがとうございました。

+0

VS2010とExpression Blendを参照していますか? –

+1

1)ソリューションを再構築して確認してください。これが最初のオプションです。 2)TextBoxのサブクラスを使用してCustomTextBoxを作成します。 OnApplyTemplateでは、このスタイルをコードブロックDesignerProperties.GetIsInDesignMode()内に適用します。したがって、このスタイルは単独でデザインモードに適用されます。このCustomTextBoxを使用します。あなたは完了です。 –

+0

@Aaronはい、これはVisual Studio 2010で、式ではありません。 – Travis

答えて

5

私はこの問題を何度も見てきましたが、回避策を見たことがないので、トリガーは機能しません。Visual Studio 2010デザイナーうまくいけば、彼らはすぐにこれを修正することができます。

私が考えることができる唯一の解決策は、これが完全に動作する代わりにExpression Blend 4のデザイン作業を行うことです。理想的ではないかもしれませんが、現時点で他の選択肢がないと思わない場合

+0

私は恐れていたかもしれません。情報をありがとう、私はブレンドをチェックして、それが平均時間の解決策であるかどうかを見ていきます。 – Travis

関連する問題