为什么以下简化代码没有将TextBlock的字体大小设置为50?
<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>
如果我更改FontSize属性的值,visual studio会显示我想要的文本大小。编译或执行应用程序后,文本块的大小始终重置为其默认大小。
我还测试了各种版本的样式和嵌入式资源,但我总是处于这样的情况:我无法在包含ContentPresenter的ControlTemplate中继承附加的dp。这是设计吗?
答案 0 :(得分:13)
我找到了这种行为的原因 - 这是设计原因:
如果ContentControl的内容已经是WPF元素,则在ContenPresenter 中使用它之前会创建它。元素的逻辑父 因此 ContentControl 。我可以通过将ContentControl-markup更改为以下内容来检查:
<ContentControl Template="{StaticResource Test}" TextBlock.FontSize="50">
<TextBlock>
This text now is shown with a size of 50
</TextBlock>
</ContentControl>
在此示例中,文本大小为50。我可以用visual studio的wpf-visualizer来证明这个论证。父级是ContentControl,通过dp继承,FontSize取自父级(ContentControl),文本显示为50!
如果ContentControl仅包含文字作为内容,则可以观察到另一种行为:
<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>
在这种情况下, TextBox 是通过ContentPresenter 创建的,因为无法在可视树中输入文本。文本框没有父级,但TemplateParent属性导致ContentPresenter作为TextBoxes父级,DP系统通过ContentPresenter附加的依赖属性继承获取FontSize值。这就是为什么在这种情况下字体大小更改为50.
描述了不同的方案here。
我不明白的是,为什么VS2010会在编译前显示FontSize 50。
答案 1 :(得分:0)
怎么样:
<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>
答案 2 :(得分:0)
这很有意思,因为我已经得到了类似的东西。有区别吗?
<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>
在xaml页面中我有:
<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>
也许我们必须使用数据模板来获得所需的效果?