WPF控件内容模型主要指派生于System.Windows.Controls.Control类的各种控件,其主要分为四部分:
ContentControl
HeaderedContendControl
ItemsControl
HeaderedItemsControl
一、ContentControl
ContentControl模型的类型具有一个 Content 属性。Content 属性的类型为 Object,因此,对于您在 ContentControl 中可以放置的内容没有任何限制。可以使用可扩展应用程序标记语言 (XAML) 或代码来设置 Content。 以下控件使用 ContentControl 内容模型: Button、ButtonBase、CheckBox、ComboBoxItem、ContentControl、Frame、GridViewColumnHeader、GroupItem、Label、ListBoxItem、ListViewItem、NavigationWindow、RadioButton、RepeatButton、ScrollViewer、StatusBarItem、ToggleButton、ToolTip、UserControl、Window
简单的说就是主要有Content属性的都具有这个模型,简单看个例子
<!--只能放置一个控件--> <Button Height="23" HorizontalAlignment="Left" Margin="12,45,0,0" Name="button1" VerticalAlignment="Top" Width="75"> <Button.Content> <Image Source="Images/main1.jpg" Width="50"></Image> </Button.Content> </Button>
这样我们就可以把一个Image控件放到Button中了
像上面的情况,我们只能放置一个控件到Content中,如果想放置多个,我们需要加一个panel容易才可以
<!--加一个容器就可以放置多个控件了--> <Button Height="34" HorizontalAlignment="Left" Margin="10,98,0,0" Name="button2" VerticalAlignment="Top" Width="107"> <Button.Content> <StackPanel Orientation="Horizontal" Width="104"> <TextBlock Text="名字" HorizontalAlignment="Center" ></TextBlock> <Image Source="Images/main1.jpg" Width="50"></Image> </StackPanel> </Button.Content> </Button>
这样就可以了
我们也可以通过代码添加Content
private void Window_Loaded(object sender, RoutedEventArgs e)
{
TextBlock tblock = new TextBlock();
tblock.Text = "代码";
TextBlock time = new TextBlock();
time.Text = DateTime.Now.ToString("hh:mm:ss");
StackPanel panel = new StackPanel();
panel.Children.Add(time);
panel.Children.Add(tblock);
button4.Content = panel;
}
二、、HeaderedContentControl模型
HeaderedContentControl类继承ContentControl类,表示带有Header的ContentControl,其除了具有ContentControl的Content属性外,还具有一个Header属性,Header的类型也是Object对象,与Content属性的用法类似。 从 HeaderedContentControl 继承的控件有:Expander、GroupBox、TabItem。
同样具有header和content的都具有这个模型
看一个例子:
<GroupBox Height="118" HorizontalAlignment="Left" Margin="10,10,0,0" Name="groupBox1" VerticalAlignment="Top" Width="215"> <GroupBox.Header> <TextBlock Text="头部"></TextBlock> </GroupBox.Header> <GroupBox.Content> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <Image Source="Images/main1.jpg" Width="48" Height="48" /> <TextBlock Text="DVD" HorizontalAlignment="Center" /> </StackPanel> </GroupBox.Content> </GroupBox>
同样也可以使用代码添加
private void Window_Loaded(object sender, RoutedEventArgs e) { GroupBox groupBox = new GroupBox(); groupBox.Header = "头部"; TextBlock tblock = new TextBlock(); tblock.Text = "代码"; TextBlock time = new TextBlock(); time.Text = DateTime.Now.ToString("hh:mm:ss"); StackPanel panel = new StackPanel(); panel.Children.Add(time); panel.Children.Add(tblock); groupBox.Content=panel }
三、ItemsControl模型
<ListBox Height="100" HorizontalAlignment="Left" Margin="12,53,0,0" Name="listBox1" VerticalAlignment="Top" Width="120"> <ListBox.Items> <CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="10,10,0,0" Name="checkBox2" VerticalAlignment="Top" /> <TextBlock Text="ComboBox ItemA"></TextBlock> <TextBlock Text="ComboBox ItemB"></TextBlock> <Image Source="Images/main1.jpg"></Image> </ListBox.Items> </ListBox>
从 ItemsControl 继承的控件包含一个对象集合。可以使用 ItemsSource 属性或 Items 属性来填充一个 ItemsControl。只要具体有Items属性的空间都具有这个模型
1、ItemsSource
使用ItemSource属性,需将其绑定到一个实现IEnumerable接口的类型的实例上,系统会枚举其成员做为ItemsControl的Item
private void BindListBoxByItemSource() { IList<TextBlock> txtblocks = new List<TextBlock>(); TextBlock tb1 = new TextBlock() { Text="文字一" }; TextBlock tb2 = new TextBlock() { Text = "文字二" }; TextBlock tb3 = new TextBlock() { Text = "文字三" }; TextBlock tb4 = new TextBlock() { Text = "文字四" }; txtblocks.Add(tb1); txtblocks.Add(tb2); txtblocks.Add(tb3); txtblocks.Add(tb4); listBox2.ItemsSource = txtblocks; }
2、Items
随 WPF 附带的每个 ItemsControl 具有一个对应的类,该类代表 ItemsControl 中的一个项。下表列出了随 WPF 附带的 ItemsControl 对象及其相应的项容器。
ItemsControl项容器
ComboBox ComboBoxItem
ContextMenu MenuItem
ListBox ListBoxItem
ListView ListViewItem
Menu MenuItem
StatusBar StatusBarItem
TabControl TabItem
TreeView TreeViewItem
<ListBox Height="100" HorizontalAlignment="Left" Margin="197,169,0,0" Name="listBox3" VerticalAlignment="Top" Width="120"> <ListBoxItem> ddddd aaaaa </ListBoxItem> <ListBoxItem> aaaa </ListBoxItem> <ListBoxItem> ggggg </ListBoxItem> </ListBox>
一个Items下面有很多的Item
本来应该这样写
<ListBox Height="100" HorizontalAlignment="Left" Margin="197,169,0,0" Name="listBox3" VerticalAlignment="Top" Width="120"> <ListBox.Items> <ListBoxItem> ddddd aaaaa </ListBoxItem> <ListBoxItem> aaaa </ListBoxItem> <ListBoxItem> ggggg </ListBoxItem> </ListBox.Items> </ListBox>
在这里也可以省略ListBox.Items,写成上面的形式
同样我们也可以通过代码添加进去
private void bindCombobox() { ComboBoxItem item = new ComboBoxItem(); item.Content = "ddfdfdfdf"; ComboBoxItem item1 = new ComboBoxItem(); item1.Content = "aaaaaaa"; ComboBoxItem item2 = new ComboBoxItem(); item2.Content = "bbbbbbb"; ComboBoxItem item3 = new ComboBoxItem(); item3.Content = "ccccccc"; comboBox2.Items.Add(item); }
四、HeaderedItemsControl模型
HeaderedItemsControl 从 ItemsControl 类继承。HeaderedItemsControl 定义 Header 属性,该属性遵从相同的规则,因为 HeaderedContentControl. WPF 的 Header 属性附带三个从 HeaderedItemsControl 继承的控件:MenuItem、ToolBar、TreeViewItem HeaderedItemsControl模型可以理解为如下结构:一个HeaderedItemsControl包含一个Items集合,每一个Item包含一个Header属性,一个子Items集合,以TreeView和TreeViewItem为例:
<Grid> <TreeView Height="233" HorizontalAlignment="Left" Margin="420,12,0,0" Name="treeView1" VerticalAlignment="Top" Width="204"> <TreeViewItem IsExpanded="True"> <TreeViewItem.Header> Tree Node A </TreeViewItem.Header> <TreeViewItem.Items> <TextBlock Text="Node A - 1" /> <Button Content="Node A - 2" /> </TreeViewItem.Items> </TreeViewItem> <TreeViewItem> <TreeViewItem.Header> Tree Node B </TreeViewItem.Header> <TreeViewItem.Items> <TextBlock Text="Node B - 1" /> <Button Content="Node B - 2" /> </TreeViewItem.Items> </TreeViewItem> </TreeView>
也可以通过代码完成
//代码绑定TreeView2 private void BindTreeView2() { TreeViewItem item1 = new TreeViewItem() { Header = "节点一" }; TreeViewItem item11 = new TreeViewItem() { Header = "节点1-1" }; item11.Items.Add("aaaa"); item11.Items.Add("bbbb"); item11.Items.Add("cccc"); item11.Items.Add("dddd"); item1.Items.Add(item11); item1.Items.Add("cccc"); item1.Items.Add("dddd"); TreeViewItem item2 = new TreeViewItem() { Header = "节点二" }; item2.Items.Add("aaaa"); item2.Items.Add("bbbb"); item2.Items.Add("cccc"); item2.Items.Add("dddd"); treeView2.Items.Add(item1); treeView2.Items.Add(item2); } private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { string dd = treeView2.SelectedItem as string; MessageBox.Show(dd); }
上面就是wpf的四个控件模型