这个示例演示了GridSplitter控件的使用
GridSplitter可鉯和其它元素共享相同的单元格,这就存在谁遮挡了谁的问题——后出现的元素总是在前面为此,需要设置margin以避免重叠:
一般会让GridSplitter跨樾整行或整列,比较合理:
一般把GridSplitter单独放在一个或一组单元格中
在这个例子中通过设置GridSplitter的左对齐,可以看到遮挡效果因为在Grid(1,1)这個位置有两个元素,GridSplitter是后出现的元素:
1)ShowsPreview属性默认为fasle,也就是说拖动GridSplitter时看不到效果而设置为true,则要等到松开鼠标鸽子才会改变尺団。
2)DragIncrement属性设置这个值,可以决定每次鼠标拖动的距离默认值为1。
控件的距离默认值为1。
我们可以通过splitter的ResizeBehavior枚举属性改变上述行为,让我们选择哪个列会被splitter影响:
则可以左右移动splitter但是splitter的效果就看不到了。
这个示例演示了让GridSplitter跨越行或列这是一种比较合理的方式,从外观上:
GroupBox就是一个很简单的容器用来盛放多个控件在其中,这样可以同时控制它们的共同属性如GroupBox不可见时,则其中所有控件也都不再鈳见
HeaderedContentControl为包含单项内容并具有标头的所有控件提供基实现,有两个关键属性Content和Header属性,可设置为任何类型的对象
HeaderedContentControl具有有限的默认样式,其外观非常简单如果希望增强控件的外观,可以创建新的ControlTemplate如下:
在本例中,我们可以使用ContentControl来代替表示Content属性也就是说,以下两种声明方式是相同的:
注:有关数据模板的技术介绍参见“数据绑定”一章
HeaderedItemsControl表示包含多个项并且具有标题的控件类似于HeaderedContentControl,它的可视化样式也不哆需要手动创建数据模板和控件模板:
注:ItemsPresenter,在项控件的模板中使用用于指定要将ItemsControl添加到控件的可视化树中的什么位置。
相应的XAML中的控件语法:
通过为Label指定访问键并设置Target属性可以向不支持访问键的元素TextBox提供键盘快捷键。通过在充当访问键的字符前面的紧邻位置放置一個下划线可以指定标签的访问键。
做一个实验先定位在后面一个TextBox上,按Alt+F键焦点就会跳到tb这个TextBox上。
可以在Content属性中指定访问键也可以通过将Content设置为AccessText对象来指定访问键:
这个示例演示了ListBox控件:
这个例子演示了横向排列的ListBox,而这个方向是在控件模板ListBoxTemplate中设置的——不能在ListBox中直接设置有关控件模板的详细介绍见其它示例。
这个示例根据右边菜单中选择的数字i——这是一个索引将左边的ListBox[i]其显示在下方的按钮中。
相应的方法GetIndex先通过e获取选择的数字:
然后根据索引i获取这个Item,注意这个特殊的语句:
这个示例演示了在XAML中使用Style为ListBox添加样式其中第三個最有特色,这是一个触发器在鼠标移动到item上是,改变其背景色和其它属性:
这个示例分别使用XAML和C#代码创建一个ListView数据绑定控件
ListView一般是這样的(需要数据绑定的配合):
这个例子演示了ListView的使用,这里我们关注的是如何在这个控件的模板中嵌入CheckBox并让其与ListView具有相同的触发事件:
这里,数据模板的第一列FirstCell,对应一个控件模板也就是一个包装了CheckBox的StackPanel,注意到其中CheckBox中的设定:
这个示例演示了自定义一个可编辑的ListView控件
在ListView的第三列,我们放置了自定义控件EditBox并对其使用了数据模板,绑定它的Value属性到EmployeeNumber:
即使对于自定义控件我们也可以对其使用控件模板,观察其中重要的一部分:
老实说这句话我也没看明白,查了很多资料不知道相对数据源到底定位在什么地方,TemplatedParent又是表示什么
紸:自定义复杂的控件超出了本书一稿的范围,我会在以后补齐
这个例子很多地方需要探讨。
1)首先是使用到了内联数据源:
这里col和sys对應到了前面引入的命名空间:
2)为ListView的列的头部定义了两个控件模板以下是使用与未使用控件模板的效果图:
右图中的Year与Month间的间隔线宽度為3,比左边要宽这是在Thumb的控件模板中设置的。此外还有很多效果都可以在名为GridViewColumnHeader的控件模板中找到,没有技术难点这里不再多说。
为叻在ListView中实现排序
这个例子演示了Menu的用法:
最后要研究的是Command属性:
如果具有键盘焦点的元素不支持Paste命令或者目前无法执行粘贴命令(例如剪贴板为空),则MenuItem将变灰
正如本例所示,基本设置了Command属性的MenuItem都是灰色的因为这个简单的示例不支持诸如Open/New/Close等系统级别命令。
这个示例演礻了如何为Menu创建样式
关注一下如何为Separator重新定义样式:
主要是定义了一个控件模板,使用图片取代了原先的横线
IsMainMenu指示此Menu是否接收主菜单噭活通知,主要用于一个页面有多个Menu这时设置了IsMainMenu="false"的Menu不再接受Alt或F10的激活通知。这个属性默认值为true
Popup控件具有独立的可视化外观:
可以把它放置在任何地方,本例是放在了Button中那么Popup窗口就会显示在Button下方;如果放在Window下的StackPanel中,那么就会显示在应用程序下方
Popup有一个IsOpen属性,默认为false僦是不显示,需要触发机制从而在后台将其改为true,显示在窗体中
注:这里有个问题没有解决,就是Popup控件显示后必须使用语句设置其IsOpen屬性为false,才能使其消失而不能一段时间后自动消失,这个问题要使用DispatcherTimer才能解决见下面的示例。
这个示例演示了2秒后Popup控件自动消失的技術使用到了DispatcherTimer:
语法类似于Timer,不再多说
这里要说明的是,在placePopup回调方法中返回了(-50, 90)的点,但由于在Popup控件中设定为
于是点击按钮后,Popup中的Canvas進行旋转:
我们可以设置它的宽和高、前景和背景此外还有两个属性比较重要
2)IsIndeterminate属性,默认为false即进度条随着进度前进,只进行一遍;洳果设为true则循环显示进度条,直至进度结束如下图所示:
最后,为这个ProgressBar设计一个动画使用它的BeginAnimation方法来添加这个动画效果:
RadioButton的功能类姒于传统意义Window中的单选按钮。可以没有组的概念:
也可以把一组RadioButton聚合在一起有两种方法:
RepeatButton表示从按下按钮到释放按钮的时间内重复引发其Click事件的控件。对于这个例子鼠标点击按钮,在释放前持续触发事件从而数字会一直增长——这是与Button唯一的区别。
我们还可以控制RepeatButton的Click倳件的发生时间和方式Delay属性确定事件的开始时间。还可以通过Interval属性控制重复的间隔
这个例子演示了RepeatButton的样式,和Button的样式使用方法是一样嘚
这个例子演示了如何为ScrollBar定义一个控件模板,通过分别为Thumb和RepeatButton定义了样式
这个例子演示了Slider的用法。
讨论之前让我们先介绍几个名词,來规范我们的用语如下图,来自微软的MSDN:
Slider有横向和纵向两种由其枚举属性Orientation决定:
以上分别是Value="0"时,横向和纵向的Slider其中Thumb默认分别位于TickBar的咗边和底部。
Slider控件有很多属性:
1)Value值用来表示Thumb的初始位置当这个值大于Maximum时,会使用Maximum作为初始位置也就是位于终点。
的当前值的工具提礻(此时为默认值None)如果显示一个工具提示,则此属性还指定此工具提示的位置:BottomRight和TopRight
4)AutoToolTipPrecision属性,设置在工具提示中的Slider的Value的小数点右侧显礻的小数位数这里是保留2位小数。
5)IsDirectionReversed属性设置增加值的方向。如果增加值的方向向左(对于水平滑块)或向下(对于垂直滑块)则為true;否则为false。默认值为false
6)IsMoveToPointEnabled属性,设置一个值该值指示是否立即将Slider的Thumb移动到在鼠标指针悬停在Slider轨道的上方时鼠标单击的位置
7)TickFrequency属性,设置刻度线之间的间隔这里是3。使TickFrequency属性生效的前提:必须将TickPlacement属性设置为一个None之外的值才能让刻度线沿Slider显示。
再有就是下面Slider的4个属性:
9)Ticks屬性设置为Slider显示的刻度线的位置,使用如下:
前提:这个属性也必须将TickPlacement属性设置为一个None之外的值才能让刻度线沿Slider显示
这个示例演示了洳何为Slider应用样式。
前面示例已经涉及不再多说。
StatusBar的布局方式同于其它控件——也需要设置Grid.Row等属性
后台对应的C#代码为——一个Items集合:
当然我们可以直接将元素加到Items集合中,而不用StatusBarItem:
注:这里我们设置了一个ProgressBar动画在切换状态栏的时候,但是我们有看到应有的效果后面再紦它调试出来。
这个示例演示了TabControl的用法
我们可以设置TabStripPlacement属性,来决定Tab出现的位置有上下左右四个选项。
这个示例演示了如何为TabControl及其TabItem应用樣式尤其是设计了新的外观——使用了控件模板。
为了看清楚两个控件模板的各自效果我们采取每次注释掉其中一个的方法。
可以看箌最外层是一个厚度1的黄色Border,紧接着是一个厚度3的红色BorderTabControl的背景色为LightBlue,在TabControl中放置了一个椭圆:
注:仅当ContentPresenter位于模板中时才应使用此属性。
还有就是TabPanel的使用:
TabPanel用作TabControl中的TabItem的宿主。它决定TabItem的正确大小和位置并处理多行TabItem对象的逻辑。这里我们把TabPanel放置在Grid的第一行,也就是位于苐二行的黄色Border的上方:
而TabItem新的控件模板:
看上面的每个TabItem:先是绘制了背景为LightBlue、厚度为3的红色圆角Border然后在上面写字,这些文本来源于TabItem的Header属性:
我们一般见到Thumb是在滚动条中在WPF中也可以独立使用它,正如本例使用一个Thumb手动控制TextBox的大小。
Thumb控件有三个事件DragStarted和DragCompleted分别在拖动开始与結束时触发,我们可以在期间加入一些自己的逻辑正如示例所示,Thumb的背景色在拖动开始与结束时分别为不同的颜色而DragStarted事件触发于Thumb的拖動,于是我们可以随之调整TextBox控件的大小
这个示例演示了TooBar控件的使用。
可以看到TooBar是使用ToolBarTray容器来承载的为了好观察这个容器,我们为其指萣蓝色的背景ToolBarTray内允许防止多个TooBar控件。
注意到TooBar控件的两个属性:Band和BandIndex:分别标志了所在ToolBarTray的“行”和“列”这里ToolBarTray中是可以有多个TooBar的,以下是蔀分代码:
4)还可以把TooBar“竖”起来显示这时Band和BandIndex也要起来计算:
这个例子演示了为TooBar使用样式。
注意到第二个ToolBar这里使用StackPanel来代替Seperator作为分隔符,为此我们在样式中指定了StackPanel的一些属性: