WPF中Popup+ContentControl+ContentTemplate引发栈溢出异常问题
WPF中Popup结合ContentControl与ContentTemplate触发栈溢出的原因分析
这是代码问题,并非WPF的Bug,核心原因是你在ContentTemplate中使用的ContentPresenter没有明确指定要渲染的内容,触发了无限递归渲染逻辑。
问题原理
当ContentControl设置了ContentTemplate后,模板内的ContentPresenter默认会尝试绑定到ContentControl的Content属性。但在异常代码中,<ContentPresenter />没有显式指定Content来源,在Popup的渲染上下文里会陷入循环:
- ContentControl使用模板渲染Content(TextBlock)
- 模板里的ContentPresenter又会触发ContentControl的模板渲染逻辑
- 上述过程反复执行,直到栈内存耗尽,抛出栈溢出异常
代码对比
- 异常代码:添加了包含无指定Content的
ContentPresenter的ContentTemplate,触发递归 - 正常代码:移除了
ContentTemplate,ContentControl直接渲染TextBlock,无递归逻辑
修复方案
在模板的ContentPresenter中明确指定Content来源,两种方式都可以:
- 使用
TemplateBinding绑定到ContentControl的Content属性:
<ContentControl> <ContentControl.ContentTemplate> <DataTemplate> <ContentPresenter Content="{TemplateBinding Content}" /> </DataTemplate> </ContentControl.ContentTemplate> <TextBlock Text="Popup text" Background="White" Foreground="Black" /> </ContentControl>
- 使用
ContentSource属性指定:
<ContentControl> <ContentControl.ContentTemplate> <DataTemplate> <ContentPresenter ContentSource="Content" /> </DataTemplate> </ContentControl.ContentTemplate> <TextBlock Text="Popup text" Background="White" Foreground="Black" /> </ContentControl>
内容的提问来源于stack exchange,提问作者Sergey Vaulin
相关产品推荐
相关产品推荐

