日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】

發布時間:2024/10/12 asp.net 102 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. DataTemplate和ControlTemplate的關系

? ? 學習過DataTemplate和ControlTemplate,你應該已經體會到,控件只是數據的行為和載體,是個抽象的概念,至于它本身長成什么樣子(控件內部結構),它的數據會長成什么樣子(數據顯示結構)都是靠Template生成的。決定控件外觀的是ControlTemplate,決定數據外觀的是DataTemplate,它們正是Control類的Template和ContentTemplate兩個屬性值

? ? 凡是Template,最終都要作用在控件上,這個控件就是Template的目標控件,也叫模板化控件。你可能會問:DataTemplate的目標應該是數據呀,怎么會是控件呢。DataTemplate給人的感覺的確是施加在數據對象上,但施加在數據對象上生成的一組控件總得有個載體吧?這個載體一般落實在一個叫做ContentPresenter對象上。ContentPresenter類只有ContentTemplate屬性、沒有Template屬性,這就證明了承載由DataTemplate生成的一組控件是他的專門用途。

? ? 至此我們可以看出,由ControlTemplate生成的控件樹其樹根就是ControlTemplate的目標控件,此模板化控件的Template屬性值就是一個ControlTemplate實例。與之相仿,由DataTemplate生成的控件其樹根是一個ContentPresenter控件,此模板化控件的ContentTemplate屬性值就是這個DataTemplate實例。因為ContentPresenter控件是ControlTemplate控件樹上的一個節點,所以DataTemplate控件樹是ControlTemplate里面的一個子樹。

? ? 顯然,如果把數據對象賦值給ContentPresenter的DataContext屬性,由DataTemplate生成的控件自然會找到這個數據對象并把它當作自己的數據源。

2. 應用


2.1 應用1

? ??

? ? 為Template設置其應用目標有兩種方法,一個是逐個設置控件的Template/ContentTemplate/ItemTemlate/CellTemplate等屬性,不想應用Template的控件不設置;另一種是整體應用,即把Template應用到某個類型的控件或者數據上。
把ControlTemplate應用到所有控件上需要借助Style來實現,但Style不能標記X:KEY,例如下面的代碼:

?

[html]?view plaincopy print?
  • <Window?x:Class="WpfApplication11.wnd11421"??
  • ????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"??
  • ????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"??
  • ????????Title="wnd11421"?Height="200"?Width="300">??
  • ????<Window.Resources>??
  • ????????<!--ControlTemplate作用在所有目標控件上,Style不能標記x:key-->??
  • ????????<Style?TargetType="{x:Type?TextBox}">??
  • ????????????<Setter?Property="Template">??
  • ????????????????<Setter.Value>??
  • ????????????????????<!--使用TemplateBinding,與模版目標一致-->??
  • ????????????????????<ControlTemplate?TargetType="{x:Type?TextBox}">??
  • ????????????????????????<Border?SnapsToDevicePixels="True"??
  • ????????????????????????????????Background="{TemplateBinding?Background}"??
  • ????????????????????????????????BorderBrush="{TemplateBinding?BorderBrush}"??
  • ????????????????????????????????BorderThickness="{TemplateBinding?BorderThickness}"??
  • ????????????????????????????????CornerRadius="5">??
  • ????????????????????????????<ScrollViewer?SnapsToDevicePixels="{TemplateBinding?SnapsToDevicePixels}"></ScrollViewer>??
  • ????????????????????????</Border>??
  • ????????????????????</ControlTemplate>??
  • ????????????????</Setter.Value>??
  • ????????????</Setter>??
  • ????????????<Setter?Property="Margin"?Value="5"></Setter>??
  • ????????????<Setter?Property="BorderBrush"?Value="Black"></Setter>??
  • ????????????<Setter?Property="Height"?Value="28"></Setter>??
  • ????????</Style>??
  • ????</Window.Resources>??
  • ????<StackPanel>??
  • ????????<TextBox></TextBox>??
  • ????????<TextBox></TextBox>??
  • ????????<TextBox?Style="{x:Null}"></TextBox>??
  • ????</StackPanel>??
  • </Window>??
  • ? ? Style沒有X:key標記,默認為引用到所有的x:type指定的控件上,如果不想應用則將style標記為{x:null}。運行效果如下圖:

    ?

    ?

    2.2 應用2

    ?

    ? ? 把DataTemplate應用到某個數據類型上是設置DataTemplate的DataType屬性,并且DataTemplate作為資源時也不能帶x:key標記, 例如下面的代碼:

    ?

    [html]?view plaincopy print?
  • <Window?x:Class="WpfApplication11.wnd11422"??
  • ????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"??
  • ????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"??
  • ????????xmlns:local="clr-namespace:WpfApplication11"??
  • ????????Title="wnd11422"?Height="200"?Width="300">??
  • ????<Window.Resources>??
  • ????????<!--DataTemplate作用在某個數據類型上,使用DataType,不能設置x:key-->??
  • ????????<DataTemplate?DataType="{x:Type?local:Unit}">??
  • ????????????<Grid>??
  • ????????????????<StackPanel?Orientation="Horizontal">??
  • ????????????????????<Grid>??
  • ????????????????????????<Rectangle?Fill="Red"?Width="{Binding?Price}"?Stroke="Yellow"></Rectangle>??
  • ????????????????????????<TextBlock?Text="{Binding?Year}"/>??
  • ????????????????????</Grid>??
  • ????????????????????<TextBlock?Text="{Binding?Price}"></TextBlock>??
  • ????????????????</StackPanel>??
  • ????????????</Grid>??
  • ????????</DataTemplate>??
  • ????</Window.Resources>??
  • ????<StackPanel>??
  • ????????<ListBox?x:Name="_listBox"></ListBox>??
  • ????????<ComboBox?x:Name="_comBox"></ComboBox>??
  • ????</StackPanel>??
  • </Window>??
  • ?

    代碼中的DataTemplate的目標數據類型和ListBox的條目類型都是Unit:

    ?

    [csharp]?view plaincopy print?
  • ///?<summary>??
  • ///?DataType??
  • ///?</summary>??
  • public?class?Unit??
  • {??
  • ????public?int?Price?{?get;?set;?}??
  • ????public?string?Year?{?get;?set;?}??
  • }??
  • 指定數據源:

    ?

    ?

    [csharp]?view plaincopy print?
  • public?partial?class?wnd11422?:?Window??
  • {??
  • ????public?wnd11422()??
  • ????{??
  • ????????InitializeComponent();??
  • ??
  • ????????List<Unit>?_listUnit?=?new?List<Unit>()??
  • ????????{??
  • ????????????new?Unit(){Price=100,?Year="2001"?},??
  • ????????????new?Unit(){Price=120,?Year="2002"?},??
  • ????????????new?Unit(){Price=140,?Year="2003"?},??
  • ????????????new?Unit(){Price=180,?Year="2004"?},??
  • ????????????new?Unit(){Price=150,?Year="2005"?},??
  • ????????????new?Unit(){Price=200,?Year="2006"?},??
  • ????????};??
  • ??
  • ????????_listBox.ItemsSource?=?_listUnit;??
  • ????????_comBox.ItemsSource?=?_listUnit;??
  • ????}??
  • }??
  • 此時DataTemplate會自動加載到所有的Unit類型對象上,盡管我沒有為ListBox和CompBox指定ItemTemplate,一樣會得到下圖的效果:

    ?



    2.3 應用3

    ?

    ? ? 很多時候數據是以XML形式存取的,如果把XML節點先轉換為CLR數據類型再應用DataTemplate就麻煩了。DataTemplate很智能,具有直接把XML數據節點當作目標對象的功能-----XML數據中的元素名(標簽名)可以作為DataType,元素的子節點和Attribute可以使用XPath來訪問。下面的代碼使用XmlDataProvider作為數據源(其XPath指出的必須是一組節點),請注意細節之處的變化,結果和應用2的效果相同:

    ?

    [html]?view plaincopy print?
  • <Window?x:Class="WpfApplication11.wnd11423"??
  • ????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"??
  • ????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"??
  • ????????Title="wnd11423"?Height="200"?Width="300">??
  • ????<Window.Resources>??
  • ????????<!--Xml中的元素名可以作為DataType-->??
  • ????????<DataTemplate?DataType="XUnit">??
  • ????????????<Grid>??
  • ????????????????<StackPanel?Orientation="Horizontal">??
  • ????????????????????<Grid>??
  • ????????????????????????<Rectangle?Fill="Red"?Width="{Binding?XPath=@Price}"?Stroke="Yellow"></Rectangle>??
  • ????????????????????????<TextBlock?Text="{Binding?XPath=@Year}"/>??
  • ????????????????????</Grid>??
  • ????????????????????<TextBlock?Text="{Binding?XPath=@Price}"></TextBlock>??
  • ????????????????</StackPanel>??
  • ????????????</Grid>??
  • ????????</DataTemplate>??
  • ????????<!--XPath指定一組節點-->??
  • ????????<XmlDataProvider?x:Key="ds"?XPath="XUnits/XUnit">??
  • ????????????<x:XData>??
  • ????????????????<XUnits?xmlns="">??
  • ????????????????????<XUnit?Price="100"?Year="2001"></XUnit>??
  • ????????????????????<XUnit?Price="120"?Year="2002"></XUnit>??
  • ????????????????????<XUnit?Price="140"?Year="2003"></XUnit>??
  • ????????????????????<XUnit?Price="180"?Year="2004"></XUnit>??
  • ????????????????????<XUnit?Price="150"?Year="2005"></XUnit>??
  • ????????????????????<XUnit?Price="200"?Year="2006"></XUnit>??
  • ????????????????</XUnits>??
  • ????????????</x:XData>??
  • ????????</XmlDataProvider>??
  • ????</Window.Resources>??
  • ????<StackPanel>??
  • ????????<!--XmlDataProvider使用Binding-->??
  • ????????<ListBox?x:Name="_listBox"?ItemsSource="{Binding?Source={StaticResource?ds}}"></ListBox>??
  • ????????<ComboBox?x:Name="_comBox"?ItemsSource="{Binding?Source={StaticResource?ds}}"></ComboBox>??
  • ????</StackPanel>??
  • </Window>??
  • ?

    ?

    2.4 應用4

    ?

    ? ? XML的優勢就是可以方便的表示帶有層級的數據,比如:年級----班級----小組 或 ?主菜單---次菜單----三級菜單。同時WPF準備了TreeView和MenuItem控件來顯示層級數據。能夠幫助層級控件顯示層級數據的模板是HierachicalDataTemplate。下面是實際工作中常見的例子:

    ? ? 值得一提的是,HierarchicalDataTemplate的作用不是MenuItem的內容而是它的Header。如果對MenuItem的單擊事件進行偵聽處理,我們就可以從被單擊的MenuItem的Header中取出XML數據。

    ?

    [html]?view plaincopy print?
  • <Window?x:Class="WpfApplication11.wnd11424"??
  • ????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"??
  • ????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"??
  • ????????Title="wnd11424"?Height="400"?Width="300">??
  • ????<Window.Resources>??
  • ????????<!--年級模版-->??
  • ????????<HierarchicalDataTemplate?DataType="Grade"?ItemsSource="{Binding?XPath=Class}">??
  • ????????????<TextBlock?Text="{Binding?XPath=@Name}"></TextBlock>??
  • ????????</HierarchicalDataTemplate>??
  • ????????<!--班級模版-->??
  • ????????<HierarchicalDataTemplate?DataType="Class"?ItemsSource="{Binding?XPath=Group}">??
  • ????????????<RadioButton?Content="{Binding?XPath=@Name}"></RadioButton>??
  • ????????</HierarchicalDataTemplate>??
  • ????????<!--分組模版-->??
  • ????????<HierarchicalDataTemplate?DataType="Group">??
  • ????????????<CheckBox?Content="{Binding?XPath=@Name}"></CheckBox>??
  • ????????</HierarchicalDataTemplate>??
  • ??
  • ????????<!--數據模版-->??
  • ????????<XmlDataProvider?x:Key="ds"?XPath="Data/Grade">??
  • ????????????<x:XData>??
  • ????????????????<Data?xmlns="">??
  • ????????????????????<Grade?Name="一年級">??
  • ????????????????????????<Class?Name="甲班">??
  • ????????????????????????????<Group?Name="A組"></Group>??
  • ????????????????????????????<Group?Name="B組"></Group>??
  • ????????????????????????????<Group?Name="C組"></Group>??
  • ????????????????????????</Class>??
  • ????????????????????????<Class?Name="乙班">??
  • ????????????????????????????<Group?Name="A組"></Group>??
  • ????????????????????????????<Group?Name="B組"></Group>??
  • ????????????????????????????<Group?Name="C組"></Group>??
  • ????????????????????????</Class>??
  • ????????????????????</Grade>??
  • ????????????????????<Grade?Name="二年級">??
  • ????????????????????????<Class?Name="丙班">??
  • ????????????????????????????<Group?Name="A組"></Group>??
  • ????????????????????????????<Group?Name="B組"></Group>??
  • ????????????????????????????<Group?Name="C組"></Group>??
  • ????????????????????????</Class>??
  • ????????????????????????<Class?Name="丁班">??
  • ????????????????????????????<Group?Name="A組"></Group>??
  • ????????????????????????????<Group?Name="B組"></Group>??
  • ????????????????????????????<Group?Name="C組"></Group>??
  • ????????????????????????</Class>??
  • ????????????????????</Grade>??
  • ????????????????</Data>??
  • ????????????</x:XData>??
  • ????????</XmlDataProvider>??
  • ????</Window.Resources>??
  • ????<!--監聽事件-->??
  • ????<StackPanel?MenuItem.Click="StackPanel_Click">??
  • ????????<Menu?ItemsSource="{Binding?Source={StaticResource?ds}}"></Menu>??
  • ????????<TreeView?ItemsSource="{Binding?Source={StaticResource?ds}}"?Margin="5"></TreeView>??
  • ????</StackPanel>??
  • </Window>??
  • 事件處理器:

    ?

    ?

    [csharp]?view plaincopy print?
  • private?void?StackPanel_Click(object?sender,?RoutedEventArgs?e)??
  • {??
  • ????//?Head為XmlElement??
  • ????XmlElement?xmlElem?=?(e.OriginalSource?as?MenuItem).Header?as?XmlElement;??
  • ????MessageBox.Show(xmlElem.Attributes["Name"].Value);??
  • }??
  • ?

    ?



    ?

    轉載于:https://www.cnblogs.com/lizhenlin/p/5906678.html

    總結

    以上是生活随笔為你收集整理的WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线观看亚洲国产 | 91超碰在 | 综合一区在线 | 日本一区二区三区四区在线观看 | 成年人在线免费观看 | 亚洲国产区 | 午夜日韩欧美 | 日本一区二区三区久久 | 日韩成人自拍 | 成人在线视频播放 | 国产乱子伦一区二区 | 日韩一区二区在线观看 | 欧美xx孕妇 | 亚洲日本一区二区 | 天天干天天操心 | www精品国产| 久久久久久国产精品免费 | 成人在线视频免费看 | 五月婷婷久久综合 | 中文字幕一区二区三区久久久 | 亚洲精品合集 | 国产精品一区二区不卡 | 第五色婷婷 | 天天干天天拍 | 国产欧美一区二区三区精华液好吗 | 99久久精品免费看国产免费软件 | 奇米影视第四色777 波多野结衣一区二区三区免费视频 | 9久久精品 | 欧美一级爆毛片 | 黄色aa大片 | 69热在线| 亚洲精品一线二线三线 | 成人黄网免费观看视频 | 一本黄色片 | 白嫩日本少妇做爰 | 少妇高潮一区二区三区99刮毛 | 91视频专区 | 国产熟女一区二区 | 亚洲精品久久久久国产 | 91国产精品一区 | 91视频论坛 | 欧美人吸奶水吃奶水 | 国内少妇精品 | 精品视频一区二区三区四区五区 | 天海翼一二三区 | 中文字幕十一区 | 午夜肉伦伦影院 | 亚洲红桃视频 | 麻豆视频免费版 | 一本到视频 | 久久精工是国产品牌吗 | 91色漫 | 成人午夜看片 | 日韩精品视频观看 | 97色干| 蜜桃成人在线 | 国产专区第一页 | 国产女人在线 | 久久久久亚洲色欲AV无码网站 | 日本精品入口免费视频 | x88av视频| 国产精品久久久久久久久久 | 激情伦成人综合小说 | 亚洲男女av | 6699嫩草久久久精品影院 | 成年人看的羞羞网站 | 日韩av福利 | 色视频导航| 美女视频久久 | 国产色综合天天综合网 | 深夜激情影院 | 九草视频在线观看 | 精品久久久久久一区二区里番 | 免费的黄色小视频 | 午夜成年人视频 | 欧洲成人在线 | 国产嫩草影院久久久久 | 成人免费视频免费观看 | 爱乃なみ加勒比在线播放 | 韩国一级一片高清免费观看 | 中文日本在线 | 超碰在97 | 中文字幕一区三区 | 青青草在线视频免费观看 | 四季av一区二区凹凸精品 | 草草影院在线 | 亚洲一级片 | 波多野结衣一区二区三区 | 久久久久性色av无码一区二区 | 亚欧乱色 | av在线免费播放 | av男人的天堂av | 羞辱狗奴的句子有哪些 | 调教驯服丰满美艳麻麻在线视频 | 成人黄色片免费看 | 国产黄色高清视频 | 欧美日韩a级| 鲁一鲁色一色 | 日本女人毛茸茸 |