• WPF 正確理解ContentPresenter


    我們先由下圖來看類層次,可知ContentControl繼承Control,ContentPresenter繼承FrameworkElement(Control也繼承FrameworkElement);

    同樣的,ItemsControl繼承Control,ItemsPresenter繼承FrameworkElement.

    ScreenClip

    在Control類並沒有Content屬性, 所以在這之上再寫了一個ContentControl, 使控件有Content屬性可以顯示內容, 而

    ContentPresenter就是負責將Content屬性顯示出來.

    接著來我們看一下實例,

    實例1:不使用ContentPresenter

    使用ContentPresenter

                <ContentControl Content="YangMark">
                    <ContentControl.Template>
                        <ControlTemplate TargetType="ContentControl">
                            <ContentPresenter></ContentPresenter>
                        </ControlTemplate>
                    </ContentControl.Template>
                </ContentControl>

    輸出結果: YangMark
    正確顯示Content!!
     
    不使用ContentPresenter
                <ContentControl Content="YangMark">
                    <ContentControl.Template>
                        <ControlTemplate TargetType="ContentControl">
    
                        </ControlTemplate>
                    </ContentControl.Template>
                </ContentControl>
     
    輸出結果:      
    無法顯示出Content!!
     
    結論1:ContentPresenter通常出現在ControlTemplate內,且若不使用ContentPresenter則
    Content屬性就無法正常顯示。
     
     
    實例2:ContentPresenter中的ContentSource屬性
    為什麼只為了顯示出Content屬性要大費周張弄出ContentPresenter呢??
    我們可以先比較以下兩種代碼不同之類,
                <ContentControl Content="YangMark" ContentStringFormat="Hello!! {0}">
                    <ContentControl.Template>
                        <ControlTemplate TargetType="ContentControl">
                            <ContentPresenter ContentSource="Content"></ContentPresenter>
                        </ControlTemplate>
                    </ContentControl.Template>
                </ContentControl>

    輸出結果:Hello!! YangMark
     
                <ContentControl Content="YangMark" ContentStringFormat="Hello!! {0}">
                    <ContentControl.Template>
                        <ControlTemplate TargetType="ContentControl">
                            <ContentPresenter Content="{TemplateBinding Content}"></ContentPresenter>
                        </ControlTemplate>
                    </ContentControl.Template>
                </ContentControl>
    輸出結果:YangMark
    僅出現Content屬性的內容!!
     
    結論2:<ContentPresenter/><ContentPresenter ContentSource="Content"/> 意義上是相同的。
    它們同時綁定了Content, ContentStringFormat, ContentTemplate和ContentTemplateSelector等內容

    屬性。

    若僅用Content="{TemplateBinding Content}"代表只綁定Content屬性而已,且ContentSource會失效。
     
     

    實例3:ContentSource的應用

     以HeaderContentControl為例,使用ContentPresenter綁定內容屬性。
                <HeaderedContentControl Header="Header" HeaderStringFormat="I'm {0}"
                                        Content="Content" ContentStringFormat="I'm {0}">
                    <HeaderedContentControl.Template>
                        <ControlTemplate TargetType="HeaderedContentControl">
                            <DockPanel>
                                
                                <ContentPresenter ContentSource="Header" DockPanel.Dock="Top"></ContentPresenter>
                                
                                <!--等同於<ContentPresenter ContentSource="Content"/>-->
                                <ContentPresenter></ContentPresenter>
                                
                            </DockPanel>
                        </ControlTemplate>
                    </HeaderedContentControl.Template>
                </HeaderedContentControl>


    輸出結果:

    I'm Header

    I’m Content

    結論3:ContentSource若指定對象為Content是可以省略的,若不為Content(如:Header)則不能省略。

    總結:

    Content, ContentStringFormat, ContentTemplate和ContentTemplateSelector等屬性, 我將它們稱為內容屬性.

    1. ContentPresenter的作用就是用來顯示內容屬性

    2.ContentSource若指定對象為Content,則等同於<ContentPresenter/>; 若指定對象不為Content,

       則必須使用ContentSource聲明指定的對象.

    參考資料:

     
     
  • 相关阅读:
    软件工程——第一次作业
    软件工程结对编程第二次作业
    软件工程结对编程第一次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    阿里云服务器ECS WindowsServer2016配置IIS遇到的坑
    微信小程序跳坑指南——小程序上线半年后遇到的坑总结
    VS2013 RC 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral.........
    Mysql主从复制原理及配置
  • 原文地址:https://www.cnblogs.com/YangMark/p/3172725.html
Copyright © 2020-2023  润新知