You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中Popup+ContentControl+ContentTemplate引发栈溢出异常问题

WPF中Popup结合ContentControl与ContentTemplate触发栈溢出的原因分析

这是代码问题,并非WPF的Bug,核心原因是你在ContentTemplate中使用的ContentPresenter没有明确指定要渲染的内容,触发了无限递归渲染逻辑。

问题原理

当ContentControl设置了ContentTemplate后,模板内的ContentPresenter默认会尝试绑定到ContentControl的Content属性。但在异常代码中,<ContentPresenter />没有显式指定Content来源,在Popup的渲染上下文里会陷入循环:

  1. ContentControl使用模板渲染Content(TextBlock)
  2. 模板里的ContentPresenter又会触发ContentControl的模板渲染逻辑
  3. 上述过程反复执行,直到栈内存耗尽,抛出栈溢出异常

代码对比

  • 异常代码:添加了包含无指定Content的ContentPresenter的ContentTemplate,触发递归
  • 正常代码:移除了ContentTemplate,ContentControl直接渲染TextBlock,无递归逻辑

修复方案

在模板的ContentPresenter中明确指定Content来源,两种方式都可以:

  1. 使用TemplateBinding绑定到ContentControl的Content属性:
<ContentControl>
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <ContentPresenter Content="{TemplateBinding Content}" />
        </DataTemplate>
    </ContentControl.ContentTemplate>
    <TextBlock Text="Popup text" Background="White" Foreground="Black" />
</ContentControl>
  1. 使用ContentSource属性指定:
<ContentControl>
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <ContentPresenter ContentSource="Content" />
        </DataTemplate>
    </ContentControl.ContentTemplate>
    <TextBlock Text="Popup text" Background="White" Foreground="Black" />
</ContentControl>

内容的提问来源于stack exchange,提问作者Sergey Vaulin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:01:13