控件:能与用户交互的元素
所有控件都继承自System.Windows.Control类,所以都具备以下几种能力
设置控件内容对齐方式
设置Tab键顺序
支持绘制背景、前景和边框
支持格式化文本内容的尺寸和字体
有哪些控件?
内容控件:可包含嵌套元素,提供近乎无限的显示能力。Label、Button、ToolTip、ScrollViewer
带标题的内容控件:TabItem、GroupBox、Expander
文本控件:Textbox、PasswordBox、RichTextBox
列表控件:ListBox、ComboBox
基于范围的控件:Slider、ProgressBar
日期控件:Calendar、DatePicker
还有一些负责菜单、工具栏、功能区、网格、树、富文档等功能的控件
背景画刷和前景画刷
Background背景画刷:控件边框内部颜色。
Foreground前景画刷:控件内部文本颜色。
Brush对象可接收单一颜色画刷SolidColorBrush、渐变色画刷LinearGradientBrush、磁贴画刷TileBrush
C#设置颜色
//用代码设置背景颜色 前景颜色同理
test_btn.Background = new SolidColorBrush(Colors.AliceBlue);
//跟随系统控件颜色
test_btn.Background = new SolidColorBrush(SystemColors.ControlColor);
//存在已经被预定义的系统控件颜色画刷
test_btn.Background = SystemColors.ControlBrush;
//设置前景颜色 即文本颜色 通过R G B值设置颜色,也可通过R G B A设置颜色 Color.FromArgb
int red = 0;
int green = 255;
int blue = 0;
test_btn.Foreground = new SolidColorBrush(Color.FromRgb((byte)red, (byte)green, (byte)blue));
XAML设置颜色
<!--方式一-->
<Button Background="AliceBlue"/>
<!--方式二-->
<Button>
<Button.Background>
<SolidColorBrush Color="AliceBlue"/>
</Button.Background>
</Button>
<!--方式三-->
<Button Background="#FFFF0000"/>
画刷还可以设置边框颜色等属性,如BorderBrush
当然不同的控件拥有的能接受画刷对象的属性就有所不同,具体还得看控件的内部定义。
字体
Control类中定义了一些字体有关的属性
FontFamily、FontSize、FontStyle、FontWeight、FontStretch
<Button Content="ABC" FontFamily="Times New Roman" FontWeight="Bold" FontSize="16"/>
文本装饰和排版
TextDecorations和Typography属性
<TextBlock Text="123" TextDecorations="Baseline" Typography.CapitalSpacing="True"/>
字体继承
和其他属性一样,存在属性继承,会流经嵌套对象。
字体替换
用逗号分隔,将备选字体加在后面,前面的找不到就会往后找。
FontFamily="Times New Roman, Technical Italic"
可以循环Fonts.SystemFontFamilies集合,获取当前计算机已安装的所有字体。
字体嵌入
处理不常见的字体,向应用程序添加.ttf字体文件,并引用使用。
<TextBlock FontFamily="./#Bayern"/>
文本格式化模式
WPF文本渲染有个缺点:文本尺寸较小时会变得模糊。
<TextBlock TextOptions.TextFormattingMode="Display"/>
仅对于96dpi的显示器上,小于15的文本设置TextOptions.TextFormattingMode="Display",可以改善显示效果
鼠标光标
通过System.Windows.Input.Cursor对象来调整需要显示不同状态情况的鼠标光标。
存在沙漏光标、手状光标、箭头光标等以及自定义样式的光标
XAML设置光标
<TextBlock x:Name="test_tb" Cursor="Arrow"/>
C#设置光标
test_tb.Cursor = Cursors.Wait;
使应用程序下每个窗口的每个元素都同时生效某种光标设置
Mouse.OverrideCursor = Cursors.Wait;
此方式将覆盖每个元素的Cursor设置
移除覆盖Mouse.OverrideCursor = null;
使用ForceCursor="True",可以使父元素覆盖子元素的光标设置
自定义光标样式,Cursor类有两个重载构造方法,用于实例化自定义光标对象。
内容控件
可以包含单个嵌套元素的控件,例如Window,所以Window通常都将内容封装到一个Grid类型的顶级容器中。
都继承自ContentControl类
Content属性有两种处理方式:
非UIElement子类对象,调用ToString(),然后显示文本。
UIElement子类对象,调用UIElement.OnRender(),将对象显示在内容控件中。
以Button用法举例
<!--用法1-->
<Button Content="确认"/>
<!--用法2-->
<Button>
<Image Source="test.png"/>
</Button>
<!--用法3-->
<Button>
<StackPanel Orientation="Horizontal">
<TextBlock Text="测试"/>
<Image Source="test.png"/>
</StackPanel>
</Button>
另外还可以使用ContentTemplate模版进行更高级智能化的表现。
还有布尔类型的HasContent属性,用来判断是否有内容。
内部布局设置
对齐属性,包括HorizontalContentAlignment、VerticalContentAlignment、Padding
这些属性都是定义在Control类中的,所有控件都有这些属性。
Label标签
支持记忆符
<Label Content="_A" Target="{Binding ElementName=txtA}"/>
<TextBox x:Name="txtA"/>
<Label Content="_B" Target="{Binding ElementName=txtB}"/>
<TextBox x:Name="txtB"/>
效果描述:这里识别Alt+A,会使第一个Label的Content变为A,并且焦点聚焦到txtA控件上。Alt+B亦复如是。
按钮
Button、CheckBox、RadioButton都是继承自ButtonBase类的按钮控件,同时也是内容控件。
Click事件和对命令的支持,都是源于ButtonBase中的定义。
ButtonBase中还有决定何时引发Click事件的属性ClickMode,默认值是ClickMode.Release,即释放鼠标时引发事件。
ClickMode还有另外两个触发模式,ClickMode.Press按下触发和ClickMode.Hover悬停触发。
Button的两个可写属性
IsCancel:如果设置为True时,在当前窗口的任何位置按下Esc都会出发该按钮
IsDefault:设置为True时按钮就成为了默认按钮。
有一个名为IsDefaulted的只读属性,猜测本意是用来判断是否为默认按钮,需谨慎使用,有的情况下其值的呈现结果可能会让人困惑。
ToggleButton
开关按钮,拥有三个状态,true、false、null,是CheckBox和RadioButton的父类。
其效果有时称为-黏贴单击(sticky click)
null值状态的设定:<ToggleButton IsChecked="{x:Null}"/>
属性IsThreeState,用于控制在点击时是否包含null值状态的循环切换。
还有三个特定状态触发事件:Checked、UnChecked、Indeterminate
RepeatButton
多次触发按钮,可用于构建ScrollBar。
CheckBox
除了样式,其他都同于其父类ToggleButton
RadioButton
继承自ToggleButton。
相较于父类,增加了GroupName属性,用于限制在同组名内只有一个RadioButton的值为True,实现单选功能。
工具提示
ToolTip:作为内容控件,可以使文本内容,也可以是复杂的嵌套内容,但是其显示内容内不可交互。
Popup:在许多方面与ToolTip相同,但不会自动显示,而且内容可以交互。
特殊容器
ScrollViewer
特点:滚动
通过属性可控制滚动条的显示与隐藏,例如VeticalScrollBarVisiblility等
可以通过代码控制滚动,有相应的方法,例如:LineUp()、PageUp()、ScrollToEnd()等一系列方法
可以自定义滚动,其核心是因为IScrollInfo接口类的支持。
CanContentScroll属性为True的时候,每次单击将会滚动到下一个元素的开头。
GroupBox
具有标题和圆角的方框
TabItem
是分页控件TabControl的子级,代表其中某一页。
Expender
扩展器,用来折叠内容,整理页面的控件
文本控件
Textbox
可通过属性设置是否进行拼写检查SellCheck.IsEnabled
可限制字数
PasswordBox
通过显示圆圈符号字符串来遮蔽实际输入字符,密码文本的输入
RichTextBox
用于显示FlowDocument对象的高级控件
列表控件
ListBox
让用户从长度可变的列表中选择一项或多项
ComboBox
与ListBox功能一致,但呈现方式为下拉列表
基于范围的控件
Slider--滑动条 ProcessBar--进度条
日期控件
Calendar--日历 DatePicker--日期选择器