【问题标题】:Exception on adding ContentPresenter to a ContentTemplate将 ContentPresenter 添加到 ContentTemplate 的异常
【发布时间】:2012-08-04 20:33:37
【问题描述】:
<ContentControl Content="Test">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Border>
                <ContentPresenter />
            </Border>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

它会抛出 stackoverflow 异常。但是,如果我使用除 ContentPresenter 之外的任何其他控件,它也可以正常工作,即使 ItemPresenter 也可以工作。我知道将 ContentPresenter 放在那里没有任何意义,只是为了了解知识。为什么它会引发 StackOverFlow 异常,以及为什么 Intellisense 显示它可以添加(我的意思是它出现在 Intellisense 中,这意味着在语法上它没有错 ContentPresenter 在那里)。任何帮助都将受到高度重视。还是 Wpf 中的任何缺陷。

【问题讨论】:

  • 你可以不指望任何事情智能感知告诉你。
  • 我将您的问题简化为最一般的情况。
  • 这里有同样的问题。你为什么说“在那里有 ContentPresenter 没有任何意义”。当您不想重新创建整个表示,而只是在周围添加一些东西时,这很有意义。顺便说一句,解决方案 ContentStringFormat="{}{0}" 有效,但有点棘手。 ContentPresenter 不应该优雅地处理这种情况,通过设计防止递归吗?

标签: c# wpf templates xaml wpf-controls


【解决方案1】:

ContentPresenter 的 MSDN 页面说:

当 ContentPresenter 对象位于 ContentControl、Content、ContentTemplate 和 ContentTemplateSelector 属性从 ContentControl 的同名属性。你可以拥有 ContentPresenter 属性从中获取这些属性的值 通过设置 ContentSource 模板化父级的其他属性 属性或绑定到它们。

我想它会给出一个 StackOverflow,因为它只是继续尝试将模板应用到 ContentTemplate 中的 ContentPresenter,然后应用到其中的下一个,然后是其中的一个,等等。

您还可以执行以下操作,因此这种模式可能并不总是错误的,即使 IntelliSense 可能不会对这类场景进行任何检查。

<ContentControl Content="Test"> 
    <ContentControl.ContentTemplate> 
        <DataTemplate> 
            <Border> 
                <ContentPresenter ContentStringFormat="{}{0}" />
            </Border> 
        </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2016-03-04
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多