WPF控件分类
在WPF中,控件的基类为Object,按照继承类的不同分为四类:
1.ContentControl——内容控件
继承自System.Windows.Controls.ContentControl;内建的内容控件分为3类:
1)按钮:Button、RepeatButton、ToggleButton、RadioButton、CheckBox
2)简单容器:Label、ToolTip、Frame
3)带头容器:GroupBox、Expander
2. ItemsControl——Items控件
继承自ItemsControl类,分为3类:
1)选择器:ComboBox、ListBox、ListView、TabControl
2)菜单:Menu、ContextMenu
3)其他:TreeView、ToolBar、StatusBar
3.RangeControl——范围控件
来自RangeBase抽象类,有ProgressBar和Slider
4.文本和墨水控件
TextBox、RichTextBox、PasswordBox和InkCanvas
具体到每个控件的使用以及注意事项,放到后边具体说明。
创建WPF应用程序
这一篇本应该介绍WPF控件中的内容控件,但是在这之前我还是将如何创建WPF App和如何执行简单介绍一下。如下:
1.打开VS2010,选择“文件”->新建项目,打开如下图对话框,单击Visual C#节点,选择“WPF应用程序”,填写程序对应的名称,存储位置,解决方案等,单击“确定”,项目创建完成。
2.创建成功后,你会看到一个处于打开状态下的.xaml文件,名称为MainWindow,这是程序创建后生成的默认的起始窗口。就像你创建asp.net程序生成一个Default.aspx文件一样。窗口布局分为上下两个部分,上部是设计选项卡,下部是XAML代码,当然可以互换。设计部分显示的内容就是程序load起来之后的界面布局效果,而XAML部分是可视化界面生成的代码,但不是C#代码。这种方式是不是觉得很熟悉?.aspx页面也是这样设计的。
3. 下面创建一个UI元素,两种方式实现:从工具箱直接拖动控件或是手写代码的方式,由于拖动控件时不免产生一些不必要的元素属性,同时效率并不是很高,所以我直接采用后者。在XAML中写下如图代码,这时你看到上边会有一个内容为OK的大大的button铺满窗口。
4.如何运行程序?此前WinForm中有一个Program.cs文件,可以在Main函数中new想要运行的窗口。但是在WPF中我并没有看到这样一个类文件。它是通过设置App.xaml文件根节点Application中的StartUri属性将某个窗口作为起始窗口的。当然默认的就是MainWindow.xaml,所以不用修改。按Ctrl+F5不调试运行(有异常时,加断点按F5执行)。
以上就是创建WPF应用程序,执行App的过程,期间对于xaml页有了一定认识。
WPF控件:内容控件
内容控件是只允许包含单一项(item)的简单控件。
内容控件都继承自Syste.Windows.Controls.ContentControl,它们拥有只含有一项的Object类型的Content属性。
因为内容控件的单一项可能是任一对象,所以它可能包含一个很大的对象树。它只能有一个直接子节点。除了Content外,ContentControl类另一个有趣的成员是HasContent布尔型属性。如果Content为空,返回false,反之返回true。
WPF自带的内容控件有3大类:按钮、简单容器、带头(Header)容器。(注:Window类也是一种内容控件)以下包括以后介绍的控件属性有很多,这里只是需要注意的属性。
1.按钮
1)Button
特点:最基本的Button。
属性:IsDefault=false,当前默认选中的Button。
注意:Button的Content属性,可以放置任何控件,不仅限于文本。
示例:
<Button>
<Rectangle Fill="Yellow" Width="150" Height="150"/>
</Button>
2)RepeatButton
特点:和普通Button不同,按钮一直被按着的情况下同样触发单击事件。
属性:Delay ——在开始重复前被按下等待的时间
Interval——开始重复后重复之间的时间间隔
注意:WPF没有内建的“上下”控件,但可以通过RepeatButton实现。
示例:
XAML:
<TextBox x:Name="txtNum" Width="100" Height="23"/>
<StackPanel HorizontalAlignment="Right" Margin="0,0,70,0" VerticalAlignment="Center">
<RepeatButton x:Name="rBtnUp" Content="+" Width="20" Height="20" Delay="500"
Interval="200" Click="rBtnUp_Click" HorizontalAlignment="Right" />
<RepeatButton x:Name="rBtnDown" Content="-" Width="20" Height="20" Delay="200"
Interval="500" Click="rBtnDown_Click" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
</StackPanel>
C#:
private int num = 0;
public RepeatButtonTest()
{
InitializeComponent();
txtNum.Text = num.ToString();
}
//增
private void rBtnUp_Click(object sender, RoutedEventArgs e)
{
num++;
txtNum.Text = num.ToString();
//MessageBox.Show(this.rBtnUp.Delay.ToString()+"\t"+this.rBtnUp.Interval.ToString());
}
//减
private void rBtnDown_Click(object sender, RoutedEventArgs e)
{
num--;
txtNum.Text = num.ToString();
}
3)ToggleButton
特点:点击时刻保留其状态的“粘性”按钮。
属性:IsChecked两个值:true、false
IsThreeState=true时,IsChecked有3个值:true、null、false
注意:IsChecked属性值在不同情况下的变化。
示例:
XAML:
<ToggleButton Content="点击" Width="60" Height="23" IsThreeState="True" Click="ToggleButton_Click"/>
C#:
private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
ToggleButton tbutton = sender as ToggleButton;
if (tbutton.IsChecked.HasValue)
MessageBox.Show("IsChecked的Value:" + tbutton.IsChecked.Value.ToString());
else
MessageBox.Show("IsChecked没有Value");
}
4)RadioButton
特点:互斥
属性:GroupName,用于分组,类型string
注意:分组名称字符串相同,即为一组。
示例:
<RadioButton Content="是" Width="60" Height="20" GroupName="g1"/>
<RadioButton Content="否" Width="60" Height="20" GroupName="g1" Margin="109,146,109,96" />
5)CheckBox
特点:与ToggleButton只是外观差别
属性:无特别
注意:它是按钮,只因为它具有按钮的特性,只是外观不太像button而已。
示例:
<CheckBox Content="C#" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20" Width="60" Height="20"/>
2.简单容器
1)Label
特点:最基本的控件
属性:Content
注意:Content存储任何内容,但只对文本有效。
示例:
<Label Content="WPF应用程序"/>
2)ToolTip
特点:存放说明性内容,可以是Image或文本等。
属性:Content
注意:必须放在赋值给另一个元素的ToolTip属性,而非直接放在元素树中。可以这样说,它必须有宿主,例如Label。
示例:
<Label Content="WPF应用程序" ToolTip="说明性文字"/>
3)Frame
特点:类似HTML中的Frame。
属性:Content
注意:加载速度稍慢。
示例:
<Frame Source="http://www.itkj0315.com"/>
3.带头容器
带头容器的特征就是Header属性。
1)GroupBox
特点:有Header属性
属性:Header
注意:无
示例:
<GroupBox Header="WPF控件" BorderBrush="Blue" Width="200" Height="100">
<StackPanel>
<CheckBox Content="内容控件" IsChecked="True"/>
<CheckBox Content="Items控件"/>
<CheckBox Content="Range控件"/>
<CheckBox Content="文本、墨水控件"/>
</StackPanel>
</GroupBox>
2)Expander
特点:可折叠
属性:Header
ExpanderDirection——Up、Down、Left、Right
IsExpanded——true(折叠)、false(展开)
事件:Expanded、Collapsed——展开、折叠时触发
示例:
<Expander Header="WPF控件" Width="200" Height="100" Panel.ZIndex="1" IsExpanded="False" ExpandDirection="Down">
<StackPanel Background="AliceBlue">
<CheckBox Content="内容控件" IsChecked="True"/>
<CheckBox Content="Items控件"/>
<CheckBox Content="Range控件"/>
<CheckBox Content="文本、墨水控件"/>
</StackPanel>
</Expander>
WPF控件:Items控件
Items控件,从名称上不难看出它是包含诸多Item的一类控件。
Items控件继承自ItemsControl类,分为3个类型:
1.选择器
选择器(selector)作为Items 控件,它的Item 不但可以被索引而且可以被选择。Selector 抽象类继承自ItemsControl,并添加了一些属性来处理选择。例如,有3 个相似的属性可以获取或设置当前的选择:
SelectedIndex——非负的整型数,它表示哪个Item 被选择了,如果没有东西被选择,则用-1 表示。Item是根据被添加到集合中的顺序来计数的。
SelectedItem——当前被选中的Item 的实例。
SelectedValue——当前被选中的Item 的值。默认情况下这个值是Item 本身,这时SelectedValue 与SelectedItem 是一样的。通过设置SelectedValuePath 去选择任意的属性或者表达式,用来表示每个Item 的值(SelectedValuePath 与DisplayMemberPath 工作原理一样)。
所有3 个属性都是可读写的,所以可以用它们去改变当前的选择,也可以用它们得到当前的选择。WPF 有4 种继承自Selector 的控件:ComboBox、ListBox、ListView、TabControl。
1)ComboBox
特点:从列表中选择一个Item。它是一种比较流行的控件,因为它不占太多空间,选择框中只显示选择的Item。
属性:IsDropDownOpen(可读写)、SelectedValuePath、DisplayMemberPath等
事件:DropDownOpened、DropDownClosed 对应IsDropDownOpen的两种状态触发相应的事件。
注意:后台数据源绑定value,显示text时,使用的是SelectedValuePath、DisplayMemberPath,绑定方式和asp.net中绑定DropDownList的数据源类似。同样ComboBox的Items可以是任何类型,Image、Text等等。
示例:
XAML:
<ComboBox Width="100" Height="20">
</ComboBox>
C#:
cbTest.DisplayMemberPath = "display"; //选择框中显示的文本
cbTest.SelectedValuePath = "value"; //选择项对应的值
cbTest.ItemsSource = source; //绑定数据源,这里和asp.net不同,没有DataSource属性,而是ItemsSource
2)ListBox
特点:支持单选和多选项的Items控件。
属性:SelectionMode——支持多选的属性,有3个值:Extended(连续多选)、Multiple(不连续多选)、Single(单选)。
注意:Header属性。
示例:VerticalAlignment="Top",布局属性,设置控件垂直方向上靠上显示。后边局部控件时具体说明。
<ListBox HorizontalAlignment="Left" VerticalAlignment="Top" SelectionMode="Extended">
<StackPanel TextSearch.Text="item1" Orientation="Horizontal" Margin="5">
<Image Source="1.bmp"/>
<StackPanel Width="80">
<TextBlock Margin="5,0" FontSize="14" FontWeight="Bold" VerticalAlignment="Center">
item1
</TextBlock>
<TextBlock Margin="5" VerticalAlignment="Center" TextWrapping="Wrap">
item1详情
</TextBlock>
</StackPanel>
</StackPanel>
<StackPanel TextSearch.Text="item2" Orientation="Horizontal" Margin="5">
<Image Source="2.bmp"/>
<StackPanel Width="80">
<TextBlock Margin="5,0" FontSize="14" FontWeight="Bold" VerticalAlignment="Center">
item2
</TextBlock>
<TextBlock Margin="5" VerticalAlignment="Center" TextWrapping="Wrap">
item2详情
</TextBlock>
</StackPanel>
</StackPanel>
</ListBox>
3)ListView
特点:继承自ListBox。
示例:
<ListView>
<ListViewItem IsSelected="True">item1</ListViewItem>
<ListViewItem>item2</ListViewItem>
</ListView>
4)TabControl
特点:默认选中第一个选项卡页。
示例:
<TabControl>
<TabItem Header="tabItem1">
<Label>Hello World!</Label>
</TabItem>
<TabItem Header="tabItem2">
<Label>Hello World,too!</Label>
</TabItem>
</TabControl>
2.菜单
1)Menu
特点:菜单
示例:
<Menu VerticalAlignment="Top">
<MenuItem Header="文件(_F)">
<MenuItem Header="新建"/>
<MenuItem Header="打开"/>
<MenuItem Header="发送">
<MenuItem Header="到桌面"/>
<MenuItem Header="到Email"/>
</MenuItem>
<MenuItem Header="退出"/>
</MenuItem>
<MenuItem Header="编辑(_E)">
<MenuItem Header="撤销"/>
<MenuItem Header="重做"/>
<MenuItem Header="剪切"/>
</MenuItem>
<MenuItem Header="视图(_V)"></MenuItem>
</Menu>
2)ContextMenu
特点:右键快捷菜单。
注意:必须有宿主元素,作为其附加属性存在。使用方式同上篇说到的ToolTip。
示例:
<ListBox VerticalAlignment="Top" Height="30">
<ListBoxItem>新增</ListBoxItem>
<ListBox.ContextMenu>
<ContextMenu>
新增操作。。。
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
3.其他Items控件
1)TreeView
特点:属性结构,层次清晰。
示例:
<TreeView>
<TreeViewItem Header="节点1">
<TreeViewItem Header="节点1-1"/>
<TreeViewItem Header="节点1-2"/>
</TreeViewItem>
<TreeViewItem Header="节点2">
<TreeViewItem Header="节点2-1"/>
</TreeViewItem>
<TreeViewItem Header="节点3"></TreeViewItem>
</TreeView>
2)ToolBar
特点:工具栏,通常在菜单栏下方显示。
示例:实现一个简单的文本编辑器
XAML :
<ToolBar VerticalAlignment="Top" Height="30" ToolBar.OverflowMode="AsNeeded">
<Button>
<Image Source="imgs/copy.gif"/>
</Button>
<Separator/>
<ToggleButton x:Name="tbBold" Click="tbBold_Click">
<Image Source="imgs/bold.gif"/>
</ToggleButton>
<ToggleButton x:Name="tbItalic" Click="tbItalic_Click">
<Image Source="imgs/italic.gif"/>
</ToggleButton>
<ToggleButton x:Name="tbUnderline" Click="tbUnderline_Click">
<Image Source="imgs/underline.gif"/>
</ToggleButton>
<Separator/>
<Label>Zoom</Label>
<ComboBox>
<ComboBoxItem Selector.IsSelected="True">100%</ComboBoxItem>
<ComboBoxItem>50%</ComboBoxItem>
<ComboBoxItem>20%</ComboBoxItem>
</ComboBox>
</ToolBar>
<TextBlock x:Name="textBlock" VerticalAlignment="Bottom" FontSize="20">
ToolBarTest
</TextBlock>
C#:
private void tbBold_Click(object sender, RoutedEventArgs e)
{
if (tbBold.IsChecked.Value == true)
textBlock.FontWeight = FontWeights.Bold;
else
textBlock.FontWeight = FontWeights.Normal;
}
private void tbItalic_Click(object sender, RoutedEventArgs e)
{
if (tbItalic.IsChecked.Value == true)
textBlock.FontStyle = FontStyles.Italic;
else
textBlock.FontStyle = FontStyles.Normal;
}
private void tbUnderline_Click(object sender, RoutedEventArgs e)
{
if (tbUnderline.IsChecked.Value == true)
textBlock.TextDecorations = TextDecorations.Underline;
else
textBlock.TextDecorations = null;
}
3)StatusBar
特点:状态栏,通常在底部显示。
示例:
<StatusBar VerticalAlignment="Bottom" Height="30">
<Label Content="状态栏"/>
<Separator/>
Zoom
<ComboBox>
<ComboBoxItem IsSelected="True">100%</ComboBoxItem>
<ComboBoxItem>50%</ComboBoxItem>
<ComboBoxItem>20%</ComboBoxItem>
</ComboBox>
<Separator/>
状态栏
</StatusBar>
WPF控件:Range控件
Range控件的核心功能来自一个叫RangeBase的抽象类。这个类定义了浮点数类型的属性来存储当前的值记忆范围的端点:Value、Minimum和Maximum。还定义了一个简单的ValueChanged事件。
Range控件不会像内容或者Items控件那样渲染任何内容,它们仅在一个指定的范围内存储并且显示数值。
两个主要的内建Range控件:ProgressBar、Slider。
1.ProgressBar
特点:进度条
属性:Minimum(默认0)、Maximum(默认100)、
IsIndeterminate(为true时,控件显示一段动画)
Orientation(默认Horizontal)
示例:
<ProgressBar Width="200" Height="20" IsIndeterminate="True" />
2.Slider
特点:比ProgressBar稍微复杂一些,用户能够通过在刻度尺移动手指光标来改变当前的值。
属性:Minimum (默认0),Maximum (默认10),
Orientation (默认Horizontal)
Delay和Interval属性
TickPlacement(TopLeft、BottomRight、Both)
IsSelectionRangeEnabled(true、false)
SelectionStart和SelectionEnd支持在当前范围内显示一个更小的范围。
示例:拖动Slider的滑块,在TextBox中显示对应的值
XAML:
<Slider Name="slider"
VerticalAlignment="Top"
Orientation="Horizontal"
TickPlacement="Both"
Minimum="0" Maximum="5"
Delay="200" Interval="100"
IsSelectionRangeEnabled="True"
SelectionStart="2"
SelectionEnd="4"
ValueChanged="slider_ValueChanged"/>
<TextBox Name="txtValue" VerticalAlignment="Bottom"/>
C#:
private void slider_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double> e)
{
txtValue.Text = e.NewValue.ToString();
}
这两个控件较之TextBox等,使用频率不是太高。
WPF控件:文本和墨水控件
之所以将文本和墨水控件放到一起,并不是它们继承自同一基类,而是它们在行为上比较相同。文本控件涉及TextBox、RichTextBox和PasswordBox三个控件,墨水控件是指InkCanvas,下边一一揭晓使用方式。