控件模板

書名:WPF專業(yè)編程指南
作者:李應(yīng)保
出版社:電子工業(yè)出版社
出版時(shí)間:2010-01
ISBN:9787121100116


控件模板

  • 在控件中使用模板
  • 在資源中使用模板
  • 在控件模板中使用TargetType
  • 在模板中顯示控件的內(nèi)容
  • 在模板中使用ContentPresenter
  • 模板中元素名Name屬性
  • 在模板中綁定控件的其他屬性
  • 使用模板顯示電力系統(tǒng)的斷路器和刀閘開關(guān)
  • 在風(fēng)格中使用模板
  • 獲取WPF控件的模板

一、在控件中使用模板

  • 在Control類中,有一個(gè)Template屬性,其類型為ControlTemplate??梢酝ㄟ^直接設(shè)置ControlTemplate,從而改變控件的視覺樹。
    由于WPF控件類都是從Control類中派生出來的,因此,可以用這個(gè)技術(shù)設(shè)置所有控件的外觀。

  • 在XAML中,設(shè)置Template的語法如下:

    <Control.Template>
      <ControlTemplat>
      ….
      …
      </ControlTemplate>
    </Control.Template>
  • 讓我們來構(gòu)建按鈕的模板,用一個(gè)填充矩形來構(gòu)建按鈕的外觀,在矩形內(nèi),用一個(gè)TextBlock來顯示按鈕上的字符串:
  <Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <StackPanel>
    <Button HorizontalAlignment="Center"
      VerticalAlignment="Center"
      FontSize="48" Padding="20" Height ="100" Width ="200">
      <Button.Template>
        <ControlTemplate >
        <Rectangle RadiusX="10" RadiusY="10" Stroke="BlueViolet"
            StrokeThickness="3" Name="myRectangle">
          <Rectangle.Fill>
            <VisualBrush Opacity="0.7">
              <VisualBrush.Visual>
              <TextBlock Name="myTextBlock"
              Foreground="LightYellow" Background="DarkBlue"
              Padding="10">模板按鈕</TextBlock>
              </VisualBrush.Visual>
            </VisualBrush>
          </Rectangle.Fill>
        </Rectangle>
        </ControlTemplate>
      </Button.Template >
    </Button>
  </StackPanel>
  </Page>
  • 由于上面的XAML的根元素為Page,可以直接在瀏覽器中顯示該XAML。上述XAML的顯示結(jié)果如圖10-2所示:


    圖10-2 模板按鈕
  • 對(duì)于按鈕控件,還需要給模板加入一些功能,使得我們的模板和通常按鈕表現(xiàn)一樣:
    當(dāng)鼠標(biāo)在按鈕控件上拖過時(shí),需要改變按鈕的顯示;
    當(dāng)用戶在按鈕上按下鼠標(biāo)時(shí),按鈕需要作出相應(yīng)的反應(yīng),使用戶知道按鈕已被按下。
    為此,需要在模板中加入觸發(fā)器。

  <ControlTemplate.Triggers>
  <Trigger  Property ="UIElement.IsMouseOver" Value ="True">
      <Setter TargetName="myRectangle" Property="Stroke"
            Value="Green"/>
      <Setter TargetName="myTextBlock" Property="Foreground"
            Value="Red"/>
  </Trigger>
  <Trigger Property="Button.IsPressed" Value="True">
      <Setter TargetName="myRectangle" Property="Stroke"
            Value="LightGreen"/>
      <Setter TargetName="myTextBlock" Property="Background">
      <Setter.Value>
        <LinearGradientBrush>
            <GradientStop Offset="1" Color="DarkBlue"/>
            <GradientStop Offset="0.5" Color="Blue"/>
            <GradientStop Offset="0" Color="DarkBlue"/>
        </LinearGradientBrush>
      </Setter.Value>
      </Setter>
  </Trigger>
  </ControlTemplate.Triggers>
  • 在控件模板中使用觸發(fā)器和在風(fēng)格中使用觸發(fā)器的原理是一樣的,這里加入了兩個(gè)觸發(fā)器。
    一個(gè)是當(dāng)IsMouseOver屬性為真時(shí),把按鈕外面的矩形框的顏色改為綠色,把按鈕的字體顏色改為紅色。
    另一個(gè)是當(dāng)IsPressed屬性為真時(shí),把按鈕外面的矩形框的顏色改為淺綠色,把字符框的背景畫刷改為線性梯度畫刷。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容