• WPF ContentControl 和 ContentPresenter 之间有什么区别


    在WPF中,ContentControlContentPresenter都与内容的展示有关,但它们在用途和行为上有一些关键的区别。

    ContentControl

    ContentControl是一个可以包含单个子元素的控件。这个子元素可以是任何UIElement,但通常是一个简单的数据对象。如果是数据对象,ContentControl会使用DataTemplate来决定如何显示该数据。

    ContentControl是许多其他控件的基类,例如ButtonLabelWindow。这意味着这些控件都可以包含内容,并且可以使用ContentTemplate来定义这些内容的呈现方式。

    例如,Button是一个ContentControl,因为你可以放置任何内容,如文本、图像甚至是另一个布局面板:

    <Button>
        <StackPanel>
            <TextBlock Text="Click me!" />
            <Image Source="button-icon.png" />
        StackPanel>
    Button>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这个例子中,Button包含一个StackPanel,其中又包含了一个TextBlock和一个Image

    ContentPresenter

    ContentPresenter是用来在控件模板(如ControlTemplateDataTemplate)中显示内容的。它通常与模板绑定一起使用,以展示ContentControlContent。你可以把ContentPresenter看作是在模板中展示内容的占位符。

    ContentPresenter遵循ContentControlContentContentTemplate属性来决定显示内容的方式。它通常不直接用于用户界面开发,而是作为模板的一部分,用于定义如何显示内容。

    例如,在自定义ButtonControlTemplate中,你可能会有这样的ContentPresenter

    <ControlTemplate TargetType="{x:Type Button}">
        <Border ...>
            <ContentPresenter Content="{TemplateBinding Content}"
                              ContentTemplate="{TemplateBinding ContentTemplate}" />
        Border>
    ControlTemplate>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这个例子中,ContentPresenter用于显示按钮的内容,并且它将遵循任何设置在Button上的ContentTemplate

    总结

    • ContentControl用于当你想要一个显示单一内容的控件,你可以直接在其内容中放置任何元素或绑定到一个数据对象,并通过ContentTemplate指定显示方式。
    • ContentPresenter用于模板内部,它引用ContentControl的内容和内容模板,并负责实际呈现这些内容。它本质上是模板中的一个内容展示占位符。

    在实际使用中,你通常会使用ContentControl或其派生类来构建用户界面,并在自定义控件模板中使用ContentPresenter来指定内容的显示位置和方式。

  • 相关阅读:
    Spring源码分析-2 Spring的简单使用和原理分析
    以SegFormer和Cityscapes为例记录MMSegmentation测试和训练
    深入了解 JavaScript 语法错误以及如何防止它们
    利用SpringBoot重写黑马旅游网
    算法学习 | 动态规划经典练习题合集
    【openGauss3.0.0之Java API基本操作】
    Go:Gnome sort 侏儒排序(附完整源码)
    python+Vue心理健康网站django
    Vue3-初识Vue3、创建Vue3工程、vue3组合式API(setup、ref函数、reactive函数)、响应式原理、计算属性、监视属性
    pytest自动化测试指定执行测试用例
  • 原文地址:https://blog.csdn.net/yao_hou/article/details/134431366