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

标签 wpf controltemplate contentpresenter

为什么下面的简化代码没有将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/

相关文章:

wpf - 选定的项目未显示在组合框中

wpf - 可通过命令调用的函数 get 调用两次

wpf - ShowDialog()何时返回null?

c# - 单击时不显示 XAML ComboBox DataTemplate 弹出窗口

c# - 在 WPF 中为 DataGridRow 创建 ControlTemplate

Silverlight:ComboBox.ItemTemplate 中的 ContentPresenter 在单击 ComboBox 时会导致所有内容崩溃

c# - 如何为Windows应用程序创建.exe文件

c# - 在 ControlTemplate 中设置按钮图像

wpf - 网格内的 ContentPresenter 可见性绑定(bind)不起作用?

c# - ContentPresenter 的异常行为