这一章书中内容比较多而杂,但每个对象的内容又相对简短,所以只挑选里边有代表性的内容做记录。
1. Label 控件:一个基础的简单的 ContentControl,Labe 支持快捷键文本的设置,可以使用以下方式为 Label 设置,使用必须遵循的语法约定为 Label 设置 Target 属性
<Label Grid.Row="0" Target="{Binding ElementName=txtA}">Choose _A</Label> <TextBox Grid.Row="1" Name="txtA"/> <Label Grid.Row="2" Target="{Binding ElementName=txtB}">Choose _B</Label> <TextBox Grid.Row="3" Name="txtB"/>
为了设置 Target 属性,需要使用一个指向另一个控件的绑定表达式。标签文本中的下划线指示快捷键(如果需要文本包含下划线,可以写上两个下划线解决),当按下 Alt 时两个标签上的 A 字母和 B 字母才会显示在字母下面的下划线(这一点和原 Windows 编程使用的 & 不一样)。绑定的作用似乎是当启动快捷键 Alt+A 时,第一个标签将焦点传递给链接的控件,即 txtA。
在 XAML 中不能直接使用 & 而要在恰当的地方使用 &.(别忘了点儿)
2. 按钮:WPF 提供三类继承自 ButtonBase 的按钮,分别是 Button、CheckBox 和 RadioButton。ButtonBase 添加了一个 ClickMode 属性,用来决定何时引发 Click 事件以响应鼠标动作。默认是 ClickMode.Release,意思是鼠标单击鼠标并释放鼠标键时引发 Click 事件,也可以选择第一次按下鼠标键时(ClickMode.Press)和悬停一会儿(ClickMode.Hover)就引发。
有关按钮的一些特性:
所有的按钮都支持访问键,即快捷键
Button 的 IsCancel 属性设置为 true,即表示成为窗体的取消按钮,在当前窗体的任何位置按下 Escape 都将触发该按钮
Button 的 IsDefault 属性设置为 true,表示成为默认按钮,行为取决于焦点在窗体中的位置。如焦点位于非按钮控件,默认按钮具有蓝色阴影,看起来像具有焦点的样子,按下 Enter 将触发默认按钮。如果焦点位于另一个按钮控件,则不会被传递到默认按钮
Button 还有一个只读属性 IsDefaulted,当焦点位于另一个控件并且该控件不接受 Enter 输入的时候,默认按钮的该属性返回 true。需要注意的是,当默认按钮本身获得焦点时,该属性将返回 False
CheckBox 是一个继承自 ToggleButton 的控件,其 IsChecked 属性是一个可空的值,因此不能简单认为其只包括 true 和 false。在 WPF 为其标记一个 null 值需要使用 null 标记扩展:
<CheckBox IsChecked="{x:Null}">Determinate state</CheckBox>想要将 CheckBox 的状态控制在只能 true 或 false,就设置其 IsThreeState 为 true。ToggleButton 的三种状态都将触发不同的三个事件,方便根据状态处理逻辑。
3. 工具提示:最简单的添加提示可以写在元素定义里,ToolTip=””即可,但在 WPF 里 ToolTip 也是个内容控件,如果想要复杂甚至嵌套其他元素的提示,可以设置元素的 ToolTip 属性,使其包含其他元素即可。
ToolTipService 作为扩展增强辅助类(我自己起的名)存在,它包含了一些 ToolTip 没有的属性和事件,可以提供额外的控制操作。
4. Popup 控件:和 ToolTip 类似,Popup 也只能包含单一内容,但这个单一内容可以包含 WPF 的任何元素(这意味着虽然只能包含一个东西,但你可以放一个容器,然后容器里边放其它元素)。Popup 的内容存储在 Popup.Child 而不像 ToolTip 在 Content 属性。
可以在 XAML 中定义 Popup 但由于必须要手动显示,所以定义的 Popup 控件必须要有 Name 以保证代码可以调用它
5. Expander 控件:Expander 是一个默认折叠起来的控件,Web 中经常可以看到它的身影,它包装了一块儿内容,并通过一个小箭头在显示和隐藏之间切换。ExpandDirection 可以调整折叠的方向,如果需要使其它控件和 Expander 同步,可以实现 Expanded 和 Collapsed 事件,这两个事件分别在显示和隐藏前被触发。