gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:15:21 30 4
gpt4 key购买 nike

为什么下面的简化代码没有将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的情况。这是设计使然吗?

最佳答案

我发现了这种行为的原因-这是设计使然:

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

在这种情况下,因为无法在可视树中输入文本,所以通过ContentPresenter 创建了 文本框 。文本框没有父级,但是TemplateParent属性作为TextBoxes父级导致ContentPresenter,并且DP系统通过从ContentPresenter附加的依赖项属性继承获取FontSize-value。因此,在这种情况下,字体大小更改为50。

here描述了不同的场景。

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

关于wpf - ControlTemplate中的ContentPresenter无法更改附加的依赖项属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3063264/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com