WPF,Silverlight与XAML读书笔记第二十 - 控件之二 – 内容控件(命令控件)
说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。
这篇文章由内容控件开始依次介绍各个控件,首先由命令控件开始,命令控件全部属于内容控件,自然都派生自ContentControl类。命令控件主要就是指按钮控件,这里的按钮指的是广义上的按钮,其代表一类可以进行单击但不能进行双击操作的控件。这类控件都继承自实现了上述行为的ButtonBase类。
ButtonBase重要成员概述:
-
Click事件:定义单击发生所需要进行的操作。
-
IsPress属性:布尔属性,表示鼠标或键盘是否处于按下状态。
-
IsEnabled属性:当为false时,按钮被呈现为灰色且不响应任何事件
-
ClickMode属性:这个枚举值表示何时触发Click事件。其可能的值为:
-
Release(默认) 在Button上按下左键后释放鼠标左键时触发
-
Press 在按钮上按下鼠标左键时触发
-
Hover 鼠标进入Button区域的时候触发Click事件
-
主要有以下几类控件实现了ButtonBase:
-
Button控件:响应来自鼠标、键盘、手写笔或其他输入设备的用户输入,并引发Click事件。
-
RepeatButton控件:表示从按下鼠标到松开之前重复引发其单击事件的按钮。
-
HyperlinkButton控件:表示显示超链接的按钮控件,单击Hyperlink控件后,用户将转到另一个网页(对于WPF,是当前应用程序的外部网页,对于Silverlight是当前页面或新窗口页面)。
Button (WPF1.0/Silverlight2.0)
Button在ButtonBase基础上增加的属性:
-
IsCancel:用于像对话框中等场景,当设置为true时表示选择了取消操作,对话框将关闭。
-
IsDefault:当其被设置为true时,按回车键则将触发按钮的Click事件。
提示:IsDefault与IsDefaulted的区别:
IsDefault为可读写的属性,而IsDefaulted是只读属性,其只表示按钮是否存在这种状态。
Button控件是一个内容控件,这意味着可以使用Content定制Button控件的内容,例如在Button中显示文字,图片,一段视频或另一个控件。如下 – 在按钮中放置一个TextBox控件:
XAML:
1 <Button x:Name="btn" Width="200" Height="50" Margin="10" > 2 <Button.Content> 3 <StackPanel> 4 <TextBox Width="160"></TextBox> 5 </StackPanel> 6 </Button.Content> 7 </Button>
如果使用内容属性的语法代替属性元素,则上面代码中斜体部分也完全可以省略掉,最终的得到的效果图(运行时)如下:
扩展:以编程方式点击一个按钮(用于自动测试)
需实现这个目的需要用到System.Windows.Automation.Peers命名空间下的ButtonAutomationPeer。其使用方式:
1 ButtonAutomationPeer bap = new ButtonAutomationPeer(btn); 2 IInvokeProvider iip = bap.GetPattern(PatternInterface.Invoke) as IInvokeProvider; 3 iip.Invoke();//点击该按钮
RepeatButton (WPF1.0/Sivlerlight2.0)
这种按钮在一直被按着的情况下触发事件,并可以控制Click事件的发生时间和方式(如触发频率)。其在基类基础上增加的属性如下:
-
Delay属性: 获取或设置RepeatButton由被按下到开始重复单击操作之前的等待时间,类型为SystemParameters.KeyboardDelay,以毫秒为单位,默认值250。
-
Interval属性: 获取单击操作的重复时间间隔,SystemParameters.KeyboardSpeed,以毫秒为单位,默认值为250。
示例代码:
1 <RepeatButton Content="响应重复单击事件" Click="RepeatButton_Click" 2 Width="250" Delay="500" Interval="800" Margin="10" 3 Height="40"></RepeatButton>
事件处理程序:
1 int count = 0; 2 private void RepeatButton_Click(object sender, RoutedEventArgs e) 3 { 4 count += 1; 5 }
RepeatButton控件同样可以定制内容,以及设置它的ClickMode属性。另外RepeatButton属于System.Windows.Controls.Primitives命名空间,这表明不建议单独使用这个控件,而是与其它控件一起使用。比如我们需要一个微调控件,用户按住上或下的按钮,文本框中的数字会不断进行变化。
ToggleButton (WPF1.0/Silverlight2.0)
ToggleButton是一种在点击时可以保留其状态的按钮。
ToggleButton支持两种状态,且点击时可以保留其状态;第一次单击按钮时,按钮会切换到另一个状态,再次单击时,按钮恢复为以前的状态。实际应用中的一个典型的例子是用于许多播放软件使用一个按钮负责播放与暂停内容 。在Click事件的处理函数中在按钮切换状态时改变外观。
其新增属性及方法如下:
-
IsCheck:Nullable<Boolean>类型值,表示按钮的状态。IsCheck属性的取值范围有两组,分别为true, null和false(按点击时状态的切换顺序排列)以及true和false。
-
IsThreeState属性:布尔值,决定上述IsCheck的取值范围是哪一组。为true时,IsCheck状态是前面那组。
当IsCheck状态切换时,会触发3个事件,分别为Checked事件(IsChecked属性变为true),Unchecked事件(IsChecked属性变为false)及Indeterminated事件(IsChecked属性为null)。
示例:
1 <ToggleButton x:Name="btn" Content="Record" Click="btn_Click" />
事件处理:
1 private void btn_Click(object sender, RoutedEventArgs e) 2 { 3 block.Text = "Status:" + btn.IsChecked == true ? "true" : "false"; 4 }
类似RepeatButton,ToggleButton也属于System.Windows.Controls.Primitives命名空间,同样不建议单独使用这个控件,而是与其它控件一起使用。
HyperlinkButton控件(WPF/Silverlight 2.0)
HyperlinkButton控件提供一个可点击的链接用于链接到NavigateUri属性制定的URI地址。作为一个内容控件,我们可以很容易的使用图片等内容替换HyperlinkButton中单调的文字。TargetName属性用于指定URL指向的内容在什么地方显示,可能的取值有_blank, _self, _top与_parant,对于有Html经验的这些值的含义很容易理解。如果页面中使用了Frame,TargetName也可以指定为Frame的名称。
在导航发生之前,HyperlinkButton会触发Click事件,你可以订阅这个事件在导航发生前进行处理,如更改导航的目标URL。
本文完
参考:
《WPF揭秘》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2010-03-06 (翻译)Entity Framework技巧系列之一 - Tip 1 - 5