2010-06-17 21 views
6

Aşağıdaki basitleştirilmiş kod neden TextBlock öğesinin font boyutunu 50 olarak ayarlamaz? Ben FontSize özelliğinin değerini değiştirirsenizControlTemplate içindeki ContentPresenter bağlı bağımlılık özelliğini değiştiremezsiniz

<Window.Resources> 
    <ControlTemplate TargetType="ContentControl" x:Key="Test"> 
     <ContentPresenter TextBlock.FontSize="50" /> 
    </ControlTemplate>   
</Window.Resources>   
<Grid> 
    <ContentControl Template="{StaticResource Test}"> 
     <TextBlock>Test should be rendered big</TextBlock> 
    </ContentControl>     
</Grid> 

görsel stüdyo bana istediğim boyutta metin gösterir. Uygulamayı derledikten veya yürüttükten sonra, metin bloğunun boyutu her zaman varsayılan boyutuna sıfırlanır.

Ayrıca, çeşitli sürümleri stilleri ve gömülü kaynaklarla test ettim, ancak her zaman ekli dp'leri bir ContentPresenter içeren bir ControlTemplate içinden devralma ayarlayamadığım durumda sonlandırıyorum. Bu tasarımla mı?

+0

Daha önce böyle bir durum yaşamadık, ancak tasarım gereği olabilir. ContentPresenter'ın kendinize sağladığınız içerikle yer değiştirdiğini düşünüyorum. – decyclone

cevap

12

tasarım tarafından açıklanmıştır: ContentControl içeriği zaten WPF Eleman ise, kullanmadan önce oluşturulan bir

ContenPresenter. öğesinin ana mantıksal nedenle ContentControl. Ben aşağıdakine ContentControl-biçimlendirme değiştirilmesiyle kontrol edebilirsiniz: İstenilen metin boyutu 50 Bu örnekte

<ContentControl Template="{StaticResource Test}" TextBlock.FontSize="50">     
    <TextBlock> 
      This text now is shown with a size of 50 
    </TextBlock>      
</ContentControl> 

. Bu argümanı görsel stüdyonun wpf-visualizer ile de kanıtlayabilirim. Üst öğe ContentControl ve dp-devralma yoluyla, FontSize üst öğeden (ContentControl) alınır ve metin 50 boyutunda gösterilir!

ContentControl içerik olarak sadece metin içeriyorsa gözlenebilir başka davranış: Bu senaryoda

<Window.Resources> 
    <ControlTemplate x:Key="Test" TargetType="{x:Type ContentControl}"> 
     <ContentPresenter TextBlock.FontSize="50"/> 
    </ControlTemplate> 
</Window.Resources>     
<Grid> 
    <ContentControl Template="{StaticResource Test}">     
     This text is shown with a size of 50 
    </ContentControl> 
</Grid> 

, metin görsel girilen edilemez çünkü ContentPresenter aracılığıyla oluşturulurTextBox ağacı. Metin kutusunda hiç ebeveyn yok ancak TemplateParent özelliği, ContentPresenter'a TextBoxes üst öğesi olarak yol açar ve DP-System, ContentPresenter'dan bağlı bağımlılık özelliği mirasını kullanarak FontSize değerini alır. Bu nedenle, bu senaryoda yazı tipi boyutu 50 olarak değiştirilmiştir.

Farklı senaryolar here olarak açıklanmıştır.

Anlamadığım şey, VS2010'un neden derlemeden önce FontSize 50'yi gösterdiğini gösteriyor.

0

Nasıl hakkında: - Bu davranışın nedeni bulundu

<Window.Resources> 
    <ControlTemplate TargetType="ContentControl" 
        x:Key="Test"> 
     <Border TextBlock.FontSize="50"> 
      <ContentPresenter /> 
     </Border> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <ContentControl Template="{StaticResource Test}"> 
     <TextBlock>Test should be rendered big</TextBlock> 
    </ContentControl> 
</Grid> 
+0

Aynı problem burada ... – HCL

+0

Doğrudan çalıştığımı gördükten sonra doğrudan kod editörümden kopyaladım! – decyclone

+0

Derlediniz ve çalıştırdınız mı? Kodu editöre kopyaladığımda çalışır. Derledikten sonra başarısız olur. Ben 3.5.1 ve şimdi de .net 4, aynı sorun altında test ettim. – HCL

0

Bu ilginç çünkü işe yaradığı gibi bir şey aldım. Bir fark var mı? xaml sayfasında

<Style x:Key="SingleWaveItemContainerStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Grid Background="{StaticResource WindowBackgroundColor}"> 
         <Border Width="125" x:Name="BorderItem" Height="60" Margin="5" BorderThickness="2" ClipToBounds="True" BorderBrush="{StaticResource ViperPanelBorderColor}" Style="{StaticResource ButtonBorderStyle}"> 
          <Rectangle x:Name="BackgroundRec" Fill="{StaticResource ViperPanelBorderColor}" Stroke="Transparent" Width="125" Height="60" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
         </Border> 
         <ContentPresenter Name="TheContentPresenter" Width="115" Height="60" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Grid> 

        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter TargetName="BorderItem" Property="BorderBrush" Value="{StaticResource NavBar_HighlightBrush}"/> 
          <Setter TargetName="BackgroundRec" Property="Fill" Value="{StaticResource NavBar_HighlightBrush}"/> 
          <Setter TargetName="TheContentPresenter" Property="TextElement.Foreground" Value="White"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 



    <DataTemplate x:Key="SingleWaveDataTemplate" DataType="ListBoxItem"> 
     <StackPanel> 
      <StackPanel Orientation="Horizontal"> 

       <TextBlock FontWeight="Bold" Text="{Binding Name, Mode=OneWay}" Width="{Binding ElementName=this, Path=Content.DesiredWidth}"/> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 

       <TextBlock FontSize="8" Text="{Binding CreationDate, Mode=OneWay}" Width="{Binding ElementName=this, Path=Content.DesiredWidth}"/> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 

Ben:

<ListBox Background="Transparent" ItemTemplate="{StaticResource SingleWaveDataTemplate}" ItemContainerStyle="{StaticResource SingleWaveItemContainerStyle}" BorderThickness="0" ItemsSource="{Binding AllModes, Mode=OneWay}" Height="{Binding ElementName=this, Path=Parent.Height}" SelectedItem="{Binding CurrentSingleWaveModeViewModel, Mode=TwoWay}"> 
        <ListBox.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Height="{Binding ElementName=Parent, Path=Height}" Background="{StaticResource WindowBackgroundColor}"/> 
         </ItemsPanelTemplate> 
        </ListBox.ItemsPanel> 
       </ListBox> 

Belki veri şablonları kullanmak VAR istenen etkiyi elde etmek için?

+0

Doh, Bunun neden işe yaradığı belli. Metin bloğu datatemplate tarafından yerleştiriliyor. Bu, kontrol panelindeki herhangi bir etkinin bunun işe yaramasına neden olacağı anlamına gelir. –

İlgili konular