久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

閑話WPF之二五(WPF中的ControlTemplate [3])

 louisasea 2007-04-23

 

在實際應(yīng)用中,,ControlTemplate是一個非常重要的功能。它幫助我們快速實現(xiàn)很Cool的自定義控件,。下面我以Windows Vista SDK中的例子ControlTemplateExamples為基礎(chǔ),,簡單地分析ControlTemplate的使用。這個例子工程非常豐富,,幾乎包含了所有的標準控件,。所以,在實現(xiàn)自定義控件時,,可以先參考這樣進行適當?shù)膶W習研究,。

首先是App.xaml文件,這里它把Application.StartupUri屬性設(shè)置為Window1.xaml,。然后把工程目錄Resource下所有的控件xaml文件都合成為了應(yīng)用程序范圍內(nèi)的資源,。

<Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Resources\Shared.xaml" />
        <!-- 這里省略 -->
        <ResourceDictionary Source="Resources\NavigationWindow.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

這樣的用法很有借鑒意義。在WPF中實現(xiàn)Skin框架也隨之變得非常簡單,。值需要動態(tài)使用不同的XAML文件即可,。然后是Window1.xaml文件。它里面幾乎把所有的控件都顯示了一遍,。沒有什么多說的,。重點看Resource目錄下的自定義控件文件。這里的控件太多,,不可能每個都說說,。我只挑選其中的Button.xaml為例:

<ResourceDictionary
  xmlns="  xmlns:x="

  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Shared.xaml"/>
  </ResourceDictionary.MergedDictionaries>

  <!-- Focus Visual -->

  <Style x:Key="ButtonFocusVisual">
    <Setter Property="Control.Template">
      <Setter.Value>
        <ControlTemplate>
          <Border>
            <Rectangle Margin="5" StrokeThickness="3"
            Stroke="#60000000" StrokeDashArray="4 2"/>
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
  <!--...............-->
</ResourceDictionary>

因為這個XAML文件作為資源使用,,所以其根元素是ResourceDictionary,而不再是Window/Application等等,。同時,,資源文件也可以相互的嵌套,比如上面的包含的Shared.xaml文件,。然后定義了一個Style,,注意這里的目標類型為Control.Template,也就是針對所有的控件模板有效,,所以Style添加了一個x:Key屬性,。這樣就阻止Style適用于當前的所有控件。我們必須顯式的引用這個Style,。相關(guān)內(nèi)容,,可以參考我前面的Style文章

另一個需要說明的是<ControlTemplate>的子元素,,可以是任何的VisualTree,。比如這里的Border,也可以是Grid等等,。好了,,現(xiàn)在定義了一個名為ButtonFocusVisual的模板,下面只需要引用它即可,。

<Style TargetType="Button">
    <!--.............-->
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
    <!--.............-->
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="Button">

          <Border x:Name="Border" ......./>

          <ControlTemplate.Triggers>
            <Trigger Property="IsKeyboardFocused" Value="true">
              <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DefaultedBorderBrush}" />
            </Trigger>           
          </ControlTemplate.Triggers>

        </ControlTemplate>
      </Setter.Value>
    </Setter>
</Style>

這是真正影響控件外觀的代碼,。因為在定義Style的時候沒有指定具體的x:Key,所以將影響所有的Button,。如你所見,,在FocusVisualStyle這個屬性(類型是Style)上我們用資源方式引用了前面定義的命名Style:ButtonFocusVisual。接下來是定義Template,,并為其子元素Border定義了一個名稱,。然后就是ControlTemplate的觸發(fā)器。在IsKeyboardFocused屬性滿足條件的情況下,,我們把Border(注意這個Border不是類型,,而是具體的某個對象)的BorderBrush修改為另一個靜態(tài)資源。結(jié)合前面的Post,,理解也就不難了,。

最后,我們還會發(fā)現(xiàn)一個有趣的問題:這個例子雖然是ControlTempalte,,但工程名稱卻是SimpleStyle,從這一點我們也可以看出:Style和Template通常是配合使用才能真正的實現(xiàn)豐富的自定義功能,。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多