2011-01-04 33 views
7

XAML'nin Tasarım Zamanı ve Çalıştırma Zamanı'nda nasıl işlendiği konusunda büyük bir sorun yaşıyorum. Çoğunlukla, işler tutarlıdır, ancak bir Tetikleyiciye sahip herhangi bir stil kullandığımda, tetikleyici Tasarım Zamanında kontrol edilmez. WPF Tasarım Zamanı vs Çalışma Zamanı Stilinde Tetikleyiciler İle Farklılıklar

<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> 
Ben aynı şeyi iki ayrı TextBox stillerini yarattı: Burada

işler farklı nasıl görüntüleneceğini göstermek için bir örnek uygulamasıdır. TextBox Tek Satırlı Olduğunda (AcceptsReturn = False) 150 olarak genişliğe ve 22 olması gereken yüksekliğe gereksinim vardır. Çok Satırlı olduğunda (AcceptsReturn = True, açıkçası) genişlik ve yüksekliğe ihtiyacım var. tüm alanı kapla.

Bu tetikleyicilerin her ikisi de, Çalıştırma Zamanında mükemmel çalışır; çünkü bu kod çalıştırıldığında, Tasarım Zamanı'nda ikisi de tetikleme koşulunda çalışmazlar. "MultiLineInTrigger" stilini kullanırken, metin kutusu (AcceptsReturn öğesinden bağımsız olarak) statik olarak ayarlanan yüksekliğe ve genişliğe sahip olacaktır, ancak "singleLineInTrigger" stilini kullanırken, AcceptsReturn değeri ne olursa olsun denetimler gerilecektir.

Bu sorun için bir çözüm var mı? Bu durum, geliştirme ekibi için oldukça zahmetli ve zaman alıcı bir hal aldı çünkü çalışmanın ne zaman çalıştığını ve ne zaman çalışıp çalışmayacağını (uzun bir süreçtir) bilmediklerini bilmiyorlar.

Teşekkürler.

+0

Tasarım zamanı varsayımı, VS2010'a karşı Expression Blend'e mi atıf yapıyorsunuz? –

+1

1) Çözümü yeniden oluşturmayı ve kontrol etmeyi deneyin, bu ilk seçenek. 2) TextBox'tan alt sınıf olarak bir CustomTextBox oluşturun. OnApplyTemplate içinde bu stili DesignerProperties.GetIsInDesignMode() kod bloğu içinde uygulayın. Yani, bu tarz tasarım moduna tek başına uygulanacak. Bu CustomTextBox'ı kullanın. Bitirdiniz. –

+0

@Aaron, Evet, Visual Studio 2010'da bu ifade değil. – Travis

cevap

5

Bu sorunu pek çok kez gördüm ve bunun için bir geçici çözüm görmedim, Trigger'lar Visual Studio 2010 Designer'da çalışmaz. Umarım yakında bu düzeltmeleri yapabilirler.

Düşünebildiğim tek çözüm, bu işin mükemmel şekilde yerine getirilmesi yerine, Expression Blend 4 tasarım işini yapmaktır. İdeal olmayabilir ama şu anda başka bir seçenek olduğunu düşünmüyorum

+0

Bu durumdan korkuyordum. Bilgi için teşekkürler, ifade karışımını kontrol edip, ortalama zamanda bir çözüm olup olmadığını kontrol edeceğim. – Travis

İlgili konular