乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      閑話WPF之二三(WPF中的ControlTemplate [1])

       joojo 2007-10-16

      通過(guò)前面的介紹,我們已經(jīng)知道WPF支持用Style Setters修改控件的屬性值,以改變控件的外觀。我們知道,WPF的任何控件都有視覺(jué)樹和邏輯樹。但是Style有它自己的局限性:它只能修改控件已有樹型結(jié)構(gòu)的屬性,不能修改控件的樹型層次結(jié)構(gòu)本身。而在實(shí)際運(yùn)用中,我們常常需要對(duì)控件進(jìn)行更高級(jí)的自定義。此時(shí),可以需要使用ControlTemplate才能實(shí)現(xiàn)。

      在WPF中,ControlTemplate用來(lái)定義控件的外觀。我們可以為控件定義新的ControlTemplate來(lái)實(shí)現(xiàn)控件結(jié)構(gòu)和外觀的修改。同樣,我們先看一個(gè)例子:

      <Style TargetType="Button">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="Button">
              <Grid>
                <Ellipse Fill="{TemplateBinding Background}"/>
                <ContentPresenter HorizontalAlignment="Center"
                                  VerticalAlignment="Center"/>
              </Grid>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>

      從例子代碼我們可以看出,ControlTemplate含有模板的語(yǔ)義。也就是說(shuō)它影響的應(yīng)該是多個(gè)控件。而這個(gè)功能恰好可以利用Style實(shí)現(xiàn)。所以,在理解了Style之后,這樣的代碼應(yīng)該不會(huì)感到陌生。首先把OverridesDefaultStyle設(shè)置為True,表示這個(gè)控件不使用當(dāng)前Themes的任何屬性。然后用Setters修改控件的Template屬性。我們定義了一個(gè)新的ControlTemplate來(lái)設(shè)置新的值。

      同樣地,ControlTemplate也使用TargetType屬性,其意義與Style的TargetType一樣。它的x:Key屬性也是如此。然后,由一個(gè)Grid來(lái)表示控件的視覺(jué)內(nèi)容。其中的TemplateBinding與Binding類似,表示當(dāng)前Ellipse的顯示顏色與Button的Background屬性保持同步。TemplateBinding可以理解為Binding在模板中的特例。而另一個(gè)ContentPresenter與WPF的基本控件類型有關(guān),一種是ContentControl,一個(gè)是ItemControl。在上面的例子中定義的是基于ContentControl的Button。所以使用ContentPresenter來(lái)表示內(nèi)容的顯示。

      WPF中每個(gè)預(yù)定義的控件都有一個(gè)默認(rèn)的模板,因此,在我們學(xué)習(xí)自定義模板(也就是自定義控件)之前,可以先熟悉了解WPF的默認(rèn)模板。為了便于查看模板的樹形結(jié)構(gòu)層次,我們可以將模板輸出為XML文件格式,這樣能有助于理解。

      XmlWriterSettings settings = new XmlWriterSettings();
      settings.Indent = true;
      settings.IndentChars = new string(‘ ‘, 4);
      settings.NewLineOnAttributes = true;
      StringBuilder strbuild = new StringBuilder();
      XmlWriter xmlwrite = XmlWriter.Create(strbuild, settings);
      XamlWriter.Save(ctrl.Template, xmlwrite);

      這里的ctrl是一個(gè)實(shí)例化的Control類。并且Control需要已經(jīng)顯示在屏幕上,否則Control.Template可能為NULL。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多