【笔记】【WPF编程宝典】 第06章 控件

  主要包含以下几类控件:

  • 内容控件:这些控件可包含嵌套元素。
  • 带有标题的内容控件:这些控件允许添加主要内容部分以及单独标题部分的内容控件。
  • 文本控件:允许用户输入文本。
  • 列表控件:在列表中显示项的集合
  • 基于范围的控件:通常只有共同的属性Value,可使用预先规定范围内的任何数字设置该属性。
  • 日期控件:此类控件包含两个允许用户选择日期的控件。

6.1 控件类

  WPF窗口充满各种元素,但这些元素只有一部分是控件。控件通常被描述为与用户交互的元素——能够接收焦点并接收键盘或鼠标输入的元素。所有控件都继承自System.Windows.Control类,该类添加了一小部分基本的基础结构:

  • 设置控件内容对齐方式的能力
  • 设置Tab键顺序的能力
  • 支持绘制背景、前景和边框
  • 支持格式化文本内容的尺寸和字体

6.1.1 背景画刷和前景画刷

  所有控件都包含背景和前景的概念。通常,背景(Background)是控件的表面,而前景(Foreground)是文本。

6.1.1.1 用代码设置颜色

cmd.Background = new SolidColorBrush(Colors.Control);

  上面的代码用Color类的静态属性与定义的颜色,创建了一个新的SolidColorBrush画刷。然后将该画刷设置为按钮的背景画刷,从而使按钮的背景被绘制成带有轻微阴影的蓝色。因为经常使用系统画刷,所以SystemColors类还提供了预定义的返回SolidColorBrush对象的属性。下面显示如何使用这些属性:

cmd.Background = SystemColors.ControlBrush;

  如果系统颜色在运行这段代码后发生了变化,不会使用新的颜色更新按钮。本质上,代码获取的是当前颜色或画刷的快照。为确保程序能够根据配置的变化进行更新,需要使用动态资源。
  也可通过提供R、G、B值创建Color对象或者提供R、G、B、A创建带有透明属性的颜色。这两种方法分别数用Color类的静态方法Color.FromRgb()与Color.FromArgb()进行创建。

6.1.1.2 在XAML中设置颜色

  在XAML中设置背景色和前景色是,可以用异常非常有用的快捷方式。不是定义Brush对象,而是提供颜色名或颜色值。WPF解析器将使用指定的颜色自动创建SolidColorBrush对象,并未前景或背景使用该画刷对象。下面给出两种等效的设置方式:

<Button Background="Red">A Button</Button>
<!--使用A、R、G、B值-->
<Button Background="#FFFF0000">A Button</Button>
<Button>
	<Button.Content>A Button</Button.Content>
	<Button.Background>
		<SolidColorBrush Color="Red" />
	</Button.Background>
</Button>

  注意
  画刷支持自动更改通知。换句话说,如果将画刷关联到某个控件并改变画刷,控件将相应地更新自身。这之所以能工作,是因为画刷继承自System.Windows.Freezable类。名称源于这样一个事实:所有可冻结的对象都有两种状态——可读状态和只读状态(或冻结状态)。

6.1.2 字体

  Control类定义了一小部分与字体相关的属性,这些属性确定文本在控件中显示的方式。

名称说明
FontFamily希望使用的字体名称
FontSize字体的设备无关单位尺寸
FontStyle表示文本角度。
可从FontStyles类的静态属性中获取需要的预定义FontStyle对象,包括Normal、Italic 或 Oblique
FontWeight表示文本粗细。
可从FontWeights类的静态字段中获取预定义的对象。Bold是这些属性中最明显的一个,但有些字体还提供了其他变种,如Heavy、Light和ExtraBold
FontStretch字体的拉伸或压缩程度。
可从FontStrectches类的静态属性中获取需要的预定义定向。例如,UltraCondensed将字体减至正常宽度的50%,而UltraExpanded将它们拓展到原来的200%。

6.1.2.1 字体家族

  字体家族是相关字体的集合——例如,Arial Regualr、Arail Bold、Arial Italic 以及 Arial Bold Italic字体都是Arial 字体家族的一部分。尽管每种变体分别定义排版规则和字符,但操作系统仍能识别出它们是相关的。因此,可使用Arial Ragular字体配置元素,将FontWeight属性设置未Bold,但一定要使WPF将其转换未Arial Bold字体。
  当选择字体时,必须提供完整的字体家族名称,如下所示:

<Button Name="cmd" FontFamily="Times New Roman" FontSize="18">A Button</Button>
<Button Name="cmd" FontFamily="Times New Roman Bold" FontSize="18">A Button</Button>
<Button Name="cmd" FontFamily="Times New Roman" FontSize="18" FontWeight="Bold">A Button</Button>
cmd.FontFamily="Times New Roman";
cmd.FontSize = 18;

6.1.2.2 文本装饰和排版

  有些元素还可以通过TextDecorationsTypography 属性,支持更高级别的文本控制。这些属性可以修饰文本。例如,可使用TextDecorations 类中的静态属性设置TextDecorations属性。该类仅提供4种修饰,每种修饰都可以为文本添加几类线,包括Baseline、Overline、Strikethtough和Underline。Typography更高级,通过该属性可以访问只有某些字体才会提供的特殊字符变种。这方面的例子包括不同的数字对齐方式、连字和小音标。
加粗样式对于大多数情况而言,TextDecorations和Typography特征只用于流文档内容。然后,这些属性也可以用于TextBox类。此外,TextBox元素也支持它们,TextBlock元素时Label控件的轻量级版本,对于显示少量可换行的文本内容,TextBlock元素时非常完美的。尽管可能不喜欢对TextBox控件使用文本修饰或改变它的排版,但可能希望在TextBlock元素种使用下划线。如下所示:

<TextBlock TextDecoration="Underlined">Underlined text</TextBlock>

6.1.2.3 字体继承

  当设置任何字体属性时,属性值都会流经嵌套的对象。例如,如果为顶级窗口设置FontFamily属性,窗口种的所有控件都会得到相同的FontFamily属性值。这种做饭之所以可行,因为字体属性是依赖项属性,并且依赖项属性能够提供的特性之一就是属性值继承——这是在嵌套的控件中传递地体设置的魔力所在。
  有必要指出,属性值继承能够流经那些根本就不支持相应属性的元素。例如,设想创建包含StackPanel面板的窗口,在StackPanel面板中有三个Label控件。可为窗口设置FontSize属性,因为Window类继承自Control,但不能为StackPanel面板设置FontSize属性,因为它不是控件。但如果设置窗口的FontSize属性,属性值仍然会经过StackPanel面板,到达其内部的标签,并改变标签的字体尺寸。
  与字体设置一样,其他几个基本属性也使用属性继承。在Control类中,Foreground属性使用继承。Background属性不使用。

6.1.2.3 字体替换

  设置字体时务必要谨慎,确保选择的字体在用户计算机上已经存在。然而,WPF没有通过字体回调提供一点灵活性。可将FontFamily属性设置为由逗号翻个的字体选项列表。WPF将按顺序遍历该列表,尝试查找在列表中指定的一种字体。
  该例试图使用Technical Italic字体,但如果该字体不存在,就使用Comic Sans MS 或Arial字体:

<Button Name="cmd" FontFamily="Technical Italic, Comic Sans MS, Arial" FontSize="18">A Button</Button>

6.1.2.3 字体嵌入

  通过字体嵌入,应用程序就永远不会出现查找所需字体这一问题。嵌入过程非常简单。首先向应用程序添加字体文件,并将Build Action选项设置为Resource。接下来,当使用字体时,需要在字体家族名称自谦添加字符序列“./#”,如下所示:

<Button Name="cmd" FontFamily="./#Bayern" FontSize="18">This is an embedded font</Button>

  WPF 将“./”字符解释为“当前文件夹”。为理解该字符串序列的焊锡,需要进一步了解与XAML打包系统相关的内容。

6.1.3 鼠标光标

  对于任何应用程序而言,一个常见任务时调整鼠标光标以指示当前应用程序处于繁忙状态或指示不同控件的工作方式。可为任何元素使用Cursor属性设置鼠标指针,该属性继承自FrameworkElement类。
  可以通过System.Windows.Input.Cursor对象来表示每个光标。获取Cursor对象的最简易方法是使用Cursors类的静态属性,它们包含了所有标准的Windows鼠标光标。
  如果使用XAML设置鼠标光标,就不需要直接使用Cursors类。这时因为Cursor属性的类型装唤起能识别属性名称,并从Cursors类中检索对应的鼠标贯标。这意味着当鼠标位于某个按钮上时,为显示“帮助”光标,可按如下方式编写标记:

<Button Cursor="Help"> Help</Button>

  有时可能设置相互重叠的光标。对于这种情况,会使用最特殊的光标。例如,可为一个按钮和包含该按钮的窗口设置不同的光标。当鼠标移动按钮上时,将显示为按钮设置的光标,而对于窗口中的其他区域则显示为窗口设置的光标。
  但有一个例外。通过使用ForceCursor属性,父元素可覆盖子元素的光标设置。将该属性设置为true时,会忽略子元素的Cursor属性,父元素的光标会被应用程序应用到内部所有的内容。
  如果希望为应用程序没个窗口的每个元素应用光标设置,使用FrameworkElement.Cursor属性将不起作用。相反,需要使用静态的Mouse.OverrideCursor属性,该属性覆盖每个元素的Cursor属性。为了一处应用程序范围的光标覆盖设置,需要将Mouse.OverrideCursor属性设置为null。
  最后,WPF完全支持自定义光标。可使用普通的.cur光标文件,也可使用.ani动画光标文件。要使用自定义的光标,需要为Cursor对象的构造函数传递光标文件的文件名或包含光标数据流:

Cursor customCursor = new Cursor(Path.Combine(applicationDir, "stopwatch.ani"));
this.Cursor = customCursor;

  Cursor对象不直接支持URI资源语法,通过该语法,其他WPF元素可使用保存在编译过的程序集中的文件。然而,可方便地位应用程序添加光标文本作为资源,然后作为可用于构造Cursor对象的数据流检索该资源。

StreamResourceInfo sri = Application.GetResourceStream(new Uri("stopeatch.ani", UriKing.Relative));
Cursor customCursor = new Cursor(sri.Stream);
this.Cursor = customCursor;

6.2 内容控件

  所有内容控件都继承自抽象基类ContentControl。它们可包含并显示一块内容。从技术角度看,内容控件是可以包含单个嵌套元素的控件。

6.2.1 Content属性

  该属性只接受单一对象。Content属性支持任何类型的对象,但可将该属性支持的对象分为两大类,针对每一类进行不同的处理:

  • 未继承自UIElement类的对象:内容控件待用这些控件的ToString方法回去文本,然后显示该文本。
  • 继承自UIElement类的对象:这些对象使用UIElement.OnRender()方法在内容控件的内部进行显示。
<Button Margin="3">Text content</Button>
<Button Source=happyface.jpg Stretch="None"/>
<Button Margin="3">
	<StackPanel>
		<TextBlock Margin="3">Image and text button</TextBlock>
		<Image Source=happyface.jpg Stretch="None"/>
		<TextBlock Margin="3">Courtesy of the StackPanel</TextBlock>
	</StachPanel>
</Button>

6.2.2 对齐内容

  内容控件中的内容如何和边框对齐,这是通过 HorizontalContentAlignment 和VerticalContentAlignment 属性实现。

6.2.3 WPF内容原则

  现在,可能会换衣WPF内容模型设计得这么复杂是否值得。毕竟,可以选择在按钮上放置一幅图像,但是未必需要将图像嵌入到其它控件或整个布局面板中。然而,有几个非常重要的原因促进了观念的转变。考虑在Button控件中放置了一个Image元素。这种方法不是非常理想的,因为位图不是分辨率无关的。在高DPI显示器上,位图显示可能会变得模糊,因为WPF必须通过插值添加更多的像素,以确保图像保持正确的大小。更完善的WPF界面应避免使用位图,而应当使用适量图形的组合来创建自定义的绘图按钮以及其他图形修饰。
  这种方法可与内容控件模型很好地集成在一起。因为Button类是内容控件,所以可以自由地使用一幅固定的位图对齐进行填充——相反,可以包括其他内容。例如,可使用System.Windows.Media.Shapes名称控件中的类,在按钮中绘制一幅矢量图像。

<Button Margin="10">
	<Grid>      
		<Polygon Points="100,25 125,0 200,25 125,50" Fill="LightSteelBlue" />
		<Polygon Points="100,25 75,0 0,25 75,50" Fill="White"/>      
	</Grid>
</Button>

6.2.4 标签

  Label控件支持记忆码——本质上,记忆符是能够为链接的控件设置焦点的快捷键。为了支持此功能,Label控件添加了Target属性。为了设置Target属性,需要使用指向另一个控件的表达式。下面是必须遵循的语法:

<StackPanel Margin="5">
    <Label Target="{Binding ElementName=txtA}">Choose _A</Label>
    <TextBox Name="txtA"/>
    <Label Target="{Binding ElementName=txtB}">Choose _B</Label>
    <TextBox Name="txtB"/>
</StackPanel>

  标签文本中的下划线指示快捷键。所有记忆符都使用Alt键和已经确定的快捷键工作

6.2.5 按钮

  WPF提供了三种继承自ButtonBase类的内容控件:Button、CheckBox、RadialButton.
  ButtonBase类增加了几个成员。定义了Click事件并听啊加了对命令的支持,从而允许为更高层的应用程序任务触发按钮。最后,ButtonBase类添加了ClickMode属性,该属性决定何时引发Click事件以相应鼠标动作。默认值是ClickMode.Release,这意味着当即和释放鼠标键是引发Click事件。然而,也可选择当鼠标第一次按下时引发Click事件(ClickMode.Press)。更奇特的是,只要将鼠标移动到按钮上并在按钮上悬停一会儿就会引发Click书简(ClickMode.Hover)。

6.2.5.1 Button

  该类添加了两个可写属性:IsCancel和IsDefault。

  • 如果将IsCancel属性设置为true,按钮就称为窗口的取消按钮。在当前串口的任何位置如果按下Esc键,就会触发该按钮。
  • 如果将IsDefault属性设置为true,按钮就称为默认按钮(也就是接受按钮)。其行为取决于焦点在窗口中的当前位置。如果焦点位于某个非按钮控件上,默认按钮具有蓝色阴影,几乎像是具有焦点。如果按下Enter键,就会触发默认按钮。但如果焦点位于另一个按钮上,当前具有焦点的按钮就具有蓝色阴影,而且按下Enter键会触发当前按钮而不是默认按钮。
    许多用户依赖于这些快捷方式,所以花一些时间在创建的每个窗口中定义这些细节是有意义的。仍需为取消按钮和默认按钮编写时间处理代码,因为WPF没有提供这一行为。
    某些情况下,将窗口中的同一个按钮既设置为取消按钮,又设置为默认按钮也是又意义的。一个例子是About对话框中的OK按钮。不过,窗口中只能由一个取消按钮和一个默认按钮。如果指定多个取消按钮,按下Esc键将把焦点移动到下一个默认按钮,而不是触发它。如果设置多个默认按钮,按下ENter键后的行为更混乱。如果焦点在某个非按钮空间上,按下Enter键会把焦点移动下一个默认按钮。如果焦点位于一个Button控件上,按下Enter键就会触发该Button控件。

6.2.5.2 ToggleButton 和 RepeatButton

  除Button类之外,还有三个类继承自ButtonBase。这些类包括:

  • GridViewColumnHeader,当使用基于网格的ListView控件时,该类表示一列可以单击的标题。
  • RepeatButton,只要按钮保持按下状态,该类就不断地触发Click事件。对于普通按钮,用户每次单击只触发一个Click事件
  • ToggleButton, 该类表示具有两个状态(按下状态和未按下状态)的按钮。当单击ToggleButton按钮时,他会保持按下状态,直到再次点击该按钮以释放它为止。
    ToggleButton 和 RepeatButton都时在System.Windows.Controls.Primitives名称空间中定义的,这表明通常不单独使用。相反,它们通常通过组合来构成更加复杂的空间,或通过继承拓展其功能。例如RepeatButton类常用于构建高级的ScrollBar控件(最终,甚至ScrollBar控件都是更高级的ScrollViewer控件的一部分)。RepeatButton类使滚动条两端的箭头按钮具有它们所特有的行为——只要按住箭头按钮不释放就会一直滚动。类似的,ToggleButton控件通常也用于派生出更有用的CheckBox类和RadialButton类。

6.2.5.3 CheckBox

  CheckBox 类没有添加任何成员,所以CheckBox类的基本接口时在ToggleButton类中定义的。最重要的是,ToggleButton类添加了IsChecked属性。IsChecked属性是可空的Boolean类型,这意味着该属性可以设置未true、false或null。显然,true表示选中的复选框,而false表示空的复选框。null值使用起来比较棘手——表示不确定状态,显示未具有阴影的复选框。不确定状态通常用于表示尚未设置的值,或存在一些差异的区域。例如,在文本应用程序中通常有用于加粗字体的复选框,并且如果当前选择的文本既包含粗体文本又包含正常文本,这是可将复选框设置为null,表示一种不确定状态。
  为在WPF标记中指定null值,需要使用null标记扩展,如下所示:

<CheckBox IsChecked="{x:null}">A check box in indeterminate state</CheckBox>

  除了IsChecked属性外,ToggleButton类还添加了IsThreeState属性,该属性据定了用户是否将复选框设置为不确定状态。如果IsThreeState属性被设置为false,单击复选框时,其状态会在选中与未选中之间切换,并且设施只能通过代码将复选框设置为不确定状态。
  ToggleButton类还定义了当复选框进入特定状态时会触发三个事件:Checked、UnChecked 和 Indeterminate。大多数情况下,可以很容易地通过处理继承自ButtonBase类的Click事件,将这一逻辑合并为单个事件处理程序。无论合适改变按钮的状态都会触发Click事件。

6.2.5.4 RadioButton

  RadioButton与CheckBox大体相同,只不过RadioButton增加了GroupName属性,该属性用于控制如何对单选按钮进行分组。

6.2.6 工具提示

  可为元素设置ToolTip属性。当鼠标悬停在元素上时,就会显示一个黄色的提示方框。

<Button ToolTip="This is my tooltip">I have a tooltip</Button>
<Button>
    <Button.ToolTip>
        <ToolTip >
            <StackPanel>
                <TextBlock Margin="3" >Image and text</TextBlock>
                <Image Source="happyface.jpg" Stretch="None" />
                <TextBlock Margin="3" >Image and text</TextBlock>          
            </StackPanel>
        </ToolTip>
    </Button.ToolTip>      
    <Button.Content>I have a fancy tooltip</Button.Content>
</Button>

6.2.6.1 设置ToolTip对象的属性

名称说明
HasDropShadow决定工具提示是否具有扩散的黑色阴影,使其和背后的窗口区别开来
Placement使用PlacementMode枚举值来决定如何放置工具提示。默认值为Mouse,表示工具提示方框在左上角与当前鼠标的位置相关(根据HorizontalOffset和VerticalOffset属性值,工具提示的实际位置可能会偏离这个起始点)。其他枚举值使用绝对屏幕坐标来设置工具提示的位置,或相对于其他元素(通过哦使用PlacementTarget属性指定该元素)设置工具提示的位置
HorizontalOffsetVerticalOffset将工具提示微调到希望的准确位置。可使用正值或负值
PlacementTarget允许相对于另一个元素定位工具提示。为使用该属性,Placement属性必须设置为Left、Right、Top、Botom或Center(这写值制定了工具提示和指定元素的哪个边缘对齐)
PlacementRectangle用于偏移工具提示的位置。该属性的工作方式于HorizontalOffset 和 VerticalOffset属性相同。如果Placement属性设置为Mouse,该属性无效
CustomPopupPlacementCallback允许使用代码动态地定位工具提示。如果Placement属性被设置为Custom,此属性确定由ToolTip调用来获取ToolTip对象放置位置的党法。回调方法接收三部分信息——popupSize、targetSize 和 offset
StaysOpen该属性实际上不起作用。它的目的是创建一直保持打开状态的工具提示,直到用户在其他地方单击鼠标才会关闭工具提示
IsEnabled
IsOpen
允许使用代码控制工具提示

6.3 特殊容器

  ScrollViewer控件,该控件继承自ContentControl类,提供虚拟界面,允许用户围绕更大的元素滚动。
  GroupBox、TabItem 以及 Expander 继承自HeaderedContentControl。HeaderedContentControl表示包含单一元素内容和单一元素标题的容器。可使用标题和/或内容布局容器,将内容封装在HeaderedContentControl中。

6.3.1 ScrollViewer

  如何希望让大连改内容适应有限空间,滚动时重要特性之一。在WPF中为了获得滚动支持,需要在ScrollViewer控件中封装希望滚动的内容。
  尽管ScrollViewer控件可以包含任何内容,但通常用来封装布局容器。如下示例:

<ScrollViewer>
	<Grid>
		...
		<Label   Grid.Row="0" Grid.Column="0">Home:</Label>
		<TextBox Grid.Row="0" Grid.Column="1"/>
		<Button  Grid.Row="0" Grid.Column="2">Browse</Button>
		...
	</Grid>
</ScrollViewer>

  如果改变窗口的尺寸以使窗口足以容纳所有内容,将会禁用滚动条。但仍会显示滚动条。可通过设置VerticalScrollBarVisibility属性来控制这一行为,该属性使用ScrollBarVisibility枚举值。默认Visible确保总是提供垂直滚动条。如果希望当需要时显示滚动条而当不需要时不显示,可将该属性设置为Auto。如果根本就不希望显示滚动条,可将该属性设置为Disable。
  ScrollViewer控件也支持水平滚动功能。但默认情况下,该属性设置为Hidden。为了使用水平滚动功能,需要将属性改为Visible或Auto。

6.3.1.1 通过代码进行滚动

  1. LineUp() 和 LineDown(),这两个方法向上和向下移动效果相当于单击一次垂直滚动条两端的箭头按钮。
  2. PageUp() 和 PageDown(),这两个方法向上或向下滚动一整屏,相当于在滚动滑块上面或下面单击滚动条。
  3. 用于水平滚动的方法类似,包括LineLeft()、LineRight()、PageLeft()、PageRight()。
  4. ScrollToXXX()这类方法,从而滚动到特定的位置。对于垂直滚动条,包括ScrollToEnd()和ScrollToHome(),这两个方法可以滚动到内容的顶部与底部。还有ScrollToVerticalOffset(),该方法可滚动到特定位置。对于碎屏滚动条也由类似的方法。

6.3.1.2 自定义滚动

  ScrollViewer 控件允许其包含的内容参与滚动过程。下面时工作原理:

  1. 在ScrollViewer控件中放置能够滚动的元素,可以实现 IScrollInfo 接口的任意元素。
  2. 通过将ScrollViewer.CanContentScroll属性设置为true,告诉ScrollViewer控件其内容知道如何进行滚动。
  3. 当和ScrollViewer控件进行交互时,ScrollViewer控件通过IScrollInfo接口来调用元素的恰当方法。元素接着执行它自己的自定义滚动功能。
      实现IScrollInfo接口的元素极少,其中一个元素时 StackPanel面板容器。StackPanel类对IScrollInfo接口的实现使用逻辑滚动,从元素滚动到元素,而不是逐行滚动。
      如果在ScrollViewer控件中放置StackPanel面板,而不设置CanContentScroll属性,将得到普通的滚动行为。一次可向上或向下滚动几个像素。但如果将CanContentScroll属性设置为true,那么每次单击时都会滚动到下一个元素的开头。

6.3.2 GroupBox

  该类显示为具有圆角和标题的方框。

<GroupBox Header="GroupBox">
	<StackPanel>
		<RadioButton>One</RadioButton>
		<RadioButton>Two</RadioButton>
		<RadioButton>Three</RadioButton>
	</StackPanel>
</GroupBox>

6.3.3 TabItem

  TabItem 表示TabControl控件中的一页。TabItem类添加的唯一有意义的属性是IsSelected,该属性指示选项卡当前是否显示在TabControl控件中。

<TabControl Margin="5">
    <TabItem Header="Tab One">
        <StackPanel Margin="3">
            <CheckBox Margin="3">Setting One</CheckBox>
            <CheckBox Margin="3">Setting Two</CheckBox>
            <CheckBox Margin="3">Setting Three</CheckBox>
        </StackPanel>
    </TabItem>
    <TabItem Header="Tab Two"></TabItem>
</TabControl>

  可使用TabStripPlacement属性,使各个选项卡在选项卡控件侧边显示,而不是在正常的顶部位置显示,
与Content属性一样,Header属性也可接收任何类型的对象。继承自UIElement的类通过渲染来显示,对于内联文本以及其他所有对象则使用ToString()方法。这意味着可以创建组合框或者选项卡,在它们的标题中包含图形内容或任意元素。例如:

<TabControl Margin="5">
    <TabItem>
        <TabItem.Header>
            <StackPanel>
                <TextBlock Margin="3" >Image and Text Tab Title</TextBlock>
                <Image Source="happyface.jpg" Stretch="None" />        
            </StackPanel>
        </TabItem.Header>
        <StackPanel Margin="3">
            <CheckBox Margin="3">Setting One</CheckBox>
            <CheckBox Margin="3">Setting Two</CheckBox>
            <CheckBox Margin="3">Setting Three</CheckBox>
        </StackPanel>
    </TabItem>
    <TabItem Header="Tab Two"></TabItem>
</TabControl>

6.3.4 Expander

  该控件封装了一块内容,通过单击小建通按钮可显示或隐藏所包含的内容。通常,每个Expander控件开始时都是折叠的,但可在标记中(或代码中)通过设置IsExpanded属性来改变这种行为。

<StackPanel>
    <Expander Header="Region One" BorderThickness="1" BorderBrush="Black">
        <Button Padding="3">Hidden Button One</Button>
    </Expander>
    <Expander Header="Region Two" BorderThickness="1" BorderBrush="Black">
    	<Expander.IsExpanded>True</Expander.IsExpanded>
        <Button Padding="3">Hidden Button Two</Button>
    </Expander>
</StackPanel>

  可通过ExpandDirection属性设置为Up、Down、Left或Right来配置展开的方向。

6.4 文本控件

  WPF提供了三个用于输入文本的控件:TextBox、RichTextBox和PasswordBox。其中,PasswordBox控件直接继承自Control类。TextBox和RichTextBox控件间接继承自TextBoxBase类。

6.4.1 多行文本

  TextBox常用于显示单行文本(可通过MaxLength属性来显示字符的数量)。然而,在许多情况下需要处理大量内容,从而会希望创建多行文本框。对于这种情况,可将TextWrapping属性设置为Wrap或WrapWithOverflow。如果将TextWrapping属性设置为Wrap,那么总会在控件边缘换行,甚至将一个特别长的单词放在两行中。如果将TextWrapping 属性设置为WrapWithOverflow,这是如果还寒该算法没有发现合适的位置(如空格或连字符)进行换行,就允许拉伸某些行使其超出右边缘。
  如果文本框支持换行,用户可输入更多能够立即在可显示行中显示的文本。因此,通过将VerticalScrollBarVisibility或HorizontalScrollBarVisibility属性设置为Visible或Auto以显示垂直或水平滚动条。
可能希望允许用户在多行文本框中通过按下Enter键输入硬回车(通常,在文本框中按下Enter键将触发默认按钮 )。为确保文本框支持Enter键,需要将AcceptReturn属性设置为true。也可设置 AcceptTabs属性,从而允许i用户插入Tab键。否则,Tab键会根据Tab键焦点顺序将焦点移动到下一个可得到焦点的控件上。

6.4.2 选择文本

  TextBox提供SelectionStart、SelectionLength以及SelectedText属性,通过编程决定选择哪些文本或改变当前所选文本的能力。
  SelectionChanged事件响应对文本选择的改变。
  通过AutoWoldSelection=true,在文本中拖动鼠标时文本框每次会选择整个单词。

6.4.3 PasswordBox

  该控件与TextBox类似,通过显示圆圈符号字符串来屏蔽实际字符,可通过设置PasswordChar属性选择不同的屏蔽字符。

6.5 列表控件

  列表控件均继承自ItemsControl类。该类添加了所有基于列表的控件都使用的基本功能。最显著的是,它提供了填充列表的两种方式。最直接的方法是使用代码或XAML将列表项直接添加到Items集合中。然而,在WPF中使用数据绑定的方式更为普遍。使用数据绑定方法,需要将ItemsSource属性设置为希望显示的具有数据项集合的对象。

6.5.1 ListBox

  ListBox类代表了一种最常用的Windows设计——允许用户从长读可变的列表中选择一项。

注意:
如果将SelectionMode属性设置为Multiple或Extended,ListBox类还允许选择多项。在Multiple模式下,可通过单击项进行选择或取消选择。在Extended模式下,需要按住Ctrl键选择其他项,或按下Shift键选择某个选项范围。

  为向ListBox控件中添加项,可在ListBox元素中嵌套ListBoxItem元素。如下:

<ListBox>
	<ListBoxItem>Green</ListBoxItem>
	<ListBoxItem>Blue</ListBoxItem>
	<ListBoxItem>Red</ListBoxItem>
</ListBox>

  ListBoxItem继承自ContentControl类,从而ListBoxItem能够包含一段嵌套的内容。如下:

<ListBox Margin="5" SelectionMode="Multiple" SelectionChanged="lst_SelectionChanged">
    <StackPanel Orientation="Horizontal">
        <Image Source="happyface.jpg"  Width="30" Height="30"></Image>
        <Label VerticalContentAlignment="Center">A happy face</Label>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Image Source="redx.jpg" Width="30" Height="30"></Image>
        <Label VerticalContentAlignment="Center">A warning sign</Label>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Image Source="happyface.jpg"  Width="30" Height="30"></Image>
        <Label VerticalContentAlignment="Center">A happy face</Label>
    </StackPanel>
</ListBox>

6.5.2 ComboBox

  ComboBox类和ListBox类之间的重要区别是它们在窗口中的呈现方式。ComboBox控件使用下来列表,这意味着一次只能选择一项。
  如果希望允许用户在组合框中通过输入文本选择一项,就必须将IsEditable属性设置为true,并且必须确保选项集合中存储的是普通的纯文本的ComboBoxItem对象,或是提供了有意义的ToString()表示的对象。

6.6 基于范围的控件

  WPF提供了三个基于范围概念的控件。这些控件使用在特定最小值和最大值之间的数值。这些控件——ScrollBar、ProgressBar以及Slider——都继承自RangeBase类。

名称说明
Value控件的当前值(必须在最大值和最小值之间)。默认情况下从0开始。
Maximum上限
Minimum下限
SmallChangeValue属性为“小变化”向上或向下调整的数量
LargeChangeValue属性为“大变化”向上或向下调整的数量

6.6.1 Slider

  当数值本身不是特别重要时可使用该控件设置数值。Slider的重要属性在RangeBase类中定义。除了这些属性外,还定义了如下属性。

名称说明
Orientation在竖直滑动条和水平滑动条之间切换
Delay
Interval
当单击并按下滑动条两侧时,控制滑块沿轨迹移动的速度。这两个属性都是毫秒值。Delay是单击后在滑块移动一个单位(小变化)之前的时间,而Interval是当继续按住鼠标键是滑块再次移动之前的时间
TickPlacement决定刻度显示的位置(刻度是在滑动条附近用于邦族观察数值的刻痕记号)。默认情况下,TickPlacement属性设置为None,并且不显示刻度标记。如果是水平滑动条,可在上面放置刻度标记(TopLeft)或在下面放置刻度标记(BottomRight)。对于数值滑动条,可在左边(TopLeft)和右边(BottomRight)放置刻度标记
TickFrequency设置刻度之间的间隔,决定了显示多少条刻度
Ticks如果希望在特定的不规则位置放置刻度。可使用Ticks集合,简单地为i每个刻度标记项该集合中添加一个数值
IsSnapToTickEnabled如果该属性为true,当移动滑动条是,会自动跳转到合适的位置——最近的刻度标记
IsSelectionRangeEnabled如果为true,可使用选择范围使滑动条的一部分显示为阴影。使用SelectionStart和SelectionEnd属性设置位置选择范围。选择范围没有固有含义,但是可以因为任何有意义的目的而使用

6.6.2 ProgressBar

  该控件指示长时间运行任务的进度。只显示,无法交互。

6.7 日期控件

  WPF包含两个日期控件:Calendar和DatePicker。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值