wpf – ControlTemplate中的ContentPresenter无法更改附加的依赖项属性

前端之家收集整理的这篇文章主要介绍了wpf – ControlTemplate中的ContentPresenter无法更改附加的依赖项属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么以下简化代码没有将TextBlock的字体大小设置为50?
  1. <Window.Resources>
  2. <ControlTemplate TargetType="ContentControl" x:Key="Test">
  3. <ContentPresenter TextBlock.FontSize="50" />
  4. </ControlTemplate>
  5. </Window.Resources>
  6. <Grid>
  7. <ContentControl Template="{StaticResource Test}">
  8. <TextBlock>Test should be rendered big</TextBlock>
  9. </ContentControl>
  10. </Grid>

如果我更改FontSize属性的值,visual studio显示我想要的文本大小.编译或执行应用程序后,文本块的大小始终重置为其默认大小.

我还测试了各种版本的样式和嵌入式资源,但我总是处于这样的情况:我无法在包含ContentPresenter的ControlTemplate中继承附加的dp.这是设计的吗?

我找到了这种行为的原因 – 它是设计的:

如果ContentControl的内容已经是WPF元素,则会在ContenPresenter中使用它之前创建它.因此,元素的逻辑父元素是ContentControl.我可以通过将ContentControl-markup更改为以下内容来检查:

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

在此示例中,文本大小为50.我可以用visual studio的wpf-visualizer证明这个论证.父级是ContentControl,通过dp继承,FontSize取自父级(ContentControl),文本显示为50!

如果ContentControl仅包含文本作为内容,则可以观察到另一种行为:

  1. <Window.Resources>
  2. <ControlTemplate x:Key="Test" TargetType="{x:Type ContentControl}">
  3. <ContentPresenter TextBlock.FontSize="50"/>
  4. </ControlTemplate>
  5. </Window.Resources>
  6. <Grid>
  7. <ContentControl Template="{StaticResource Test}">
  8. This text is shown with a size of 50
  9. </ContentControl>
  10. </Grid>

在此方案中,TextBox是通过ContentPresenter创建的,因为无法在可视树中输入文本.文本框没有父级,但TemplateParent属性导致ContentPresenter作为TextBoxes父级,DP系统通过ContentPresenter附加的依赖属性继承获取FontSize值.这就是为什么在这种情况下字体大小更改为50.

描述了不同的场景here.

我不明白的是,为什么VS2010在编译之前会显示FontSize 50.

猜你在找的设计模式相关文章