第6章-控件

news/2025/2/26 18:53:43/文章来源:https://www.cnblogs.com/myshiqiqi/p/18739363

控件,继承自 System.Windows.Contorl 类

控件分类
  • 内容控件:Label/Button/ToolTip/ScrollViewer
  • 带有标题的内容控件:TabItem/GroupBox/Expander
  • 文本控件:Textbox/PasswordBox/RichTextBox
  • 列表控件:ListBox/ComboBox
  • 基于范围的控件:Slider/ProgressBar
  • 日期控件:Calendar/DatePicker

控件类

✒ 什么是控件?
控件通常被描述为与用户交互的元素——能以旧换新焦点并接收键盘或鼠标输入的元素。

背景画刷和前景画刷

btn.Background = new SolidColorBrush(Colors.AliceBlue);
btn.Background = new SolidColorBrush(SystemColors.ControlColor); // 系统颜色
btn.Background = SystemColors.ControlBrush; // 系统预定义的画刷值
btn.Background = new SolidColorBrush(Color.FromRgb(0,255,0)); // 通过 R、G、B值定义颜色画刷(0~255)
btn.Background = new SolidColorBrush(Color.FromArgb(0,0, 255, 0)); // 通过 Alpha 值指定画刷透明值
btn.Background = new SolidColorBrush(Color.FromScRgb(0, 0, 255, 0)); // 通 ScRgb 的颜色值范围更广
<Button x:Name="btn"Background="Red"Content="Hello" /><Button Content="Hello"><Button.Background><SolidColorBrush Color="Red" /></Button.Background>
</Button><Button Background="#FFFF0000" Content="Hello" />

字体

Control 类中与字体相关属性

  • FontFamily
  • FontSize
  • FontStyle
  • FontWeight
  • FontStretch
文本装饰和排版属性

TextDecorations:可为文本添加几类线,包括 Baseline/ OverLine/ Strikethrough和 Underline
❓ Typography: 提供特殊字体的变种,如 数字对齐方式、连字和小音标

当设置任何字体属性时,属性值都会流经嵌套的对象。

在 Control 类中,使用继承的属性:
  • Foreground
  • AllowDrop
  • IsEnabled
  • ❓ CultureInfo
  • ❓ FlowDirection
    不使用继承的属性:
  • Background
当需要使用的字体不明确时,可将 FontFamily 属性设置为由逗号分隔的字体选项列表

FontFamily = "字体A, 字体B, 字体C" 👉 如果字体名称中有逗号,需要使用两个逗号进行转义

查找本地支持的字体
foreach (FontFamily fontFamily in Fonts.SystemFontFamiles)
{ lst.Fonts.Items.Add(fontFamily.Source);}
字体嵌入

向程序添加 .ttf 字体文件,并将其添加到资源。需要在嵌入的字体名前加#号

<Label FontFamily="./#字体名" />

也可以便用URI格式语句查找嵌入的字体。

文本格式化模式:当小字体显示模式时的解决方案

在 96 dpi 显示器上使用15号的字体显示才不会模糊
解决小字模问题可使用属性:TextOptions.TextFormattingMode 附加属性,并设置值为 Display(默认值是 Ideal),但如果为15号以上的文本设置该属性,文本将不会同样清晰

<TextBlock FontSize="9"Text="Hello"TextOptions.TextFormattingMode="Display" />
为元素设置鼠标样式
this.Cursor = Cursors.Wait;
<Button Cursor="Help" />

<StackPanel Width="200" ForceCursor="True" Cursor="Hand"> 如果将父容器中的 ForceCursor="True" 属性设置为 True,则所有子元素的鼠标样式都将被父窗口的鼠标样式所覆盖

❓❓ 👆 解决被父容器覆盖的鼠标样式

Mouse.OverrideCursor = Cursors.Hand;
Mouse.OverrideCursor = null;
自定义鼠标样式
// 将 .cur 或 .ani 的光标文件添加到项目,并生成到资源中
// 使用 Application.GetRemoteStream 查找光标资源
// 使用该资源生成光标对象,并应用到当前光标上
StreamResourceInfo sri = Application.GetRemoteStream(new Uri("stopwatch.ani", UriKind.Relative));
Cursor customCursor = new Cursor(sri.Stream);
this.Cursor = customCursor;

内容控件

所有内容控件都继承自抽象类 ContentControl

内容控件只能包含一个子元素。

属性:Content
Content 接受子元素对象

  • 子元素可以是 UIElement 类的对象
  • 也可以不是继承自 UIElement 类的对象

Windows 类虽然也是内容控件,但它必须是顶级窗口。

对齐

HorizontalAlignment 和 VerticalAlignment 控件控件本身的位置
HorizontalContentAlignment 和 VerticalContentAlignment 控件子元素的对齐

Leabel 支持记忆符

<Label Target="{Binding ElementName=txtA}" Content="跳转 _A"/>
<TextBox Name="txtA"/>

👆 当下按Alt + A 时,焦点会跳转到 txtA 控件,跳转符必须使用下划线
💡 ❓这个功能有啥用?

按钮类:

Button/CheckBox/RedioButton/ToggleButton/RepeatButton/GridViewColumnHeader 都继承自 ButtonBase类
ButtonBase 添加了 ClickMode 属性:表示在何时触发事件

  • Release:引发的是 Click
  • Press: 引发的是 按下事件
  • Hover:引发的是光标进入事件

Button 添加了 IsCancel 属性,表示按下 Esc 键时触发事件;还添加了 IsDefault 属性,表示在当前窗体上按下回车时触发事件(当前焦点必须是一个非按钮上)

RepeatButton 按钮在鼠标按下时会一直触发事件

由 ToggleButton 派生出两个按钮:
  • CheckBox
  • RadioButton
<CheckBox IsChecked="{x:Null}" /> 表示没有选中

支持三种状态 IsChecked 👉 true/false/null
支持三种事件 Checked/UnChecked/Indeterminate

ToggleButton 的属性 IsThreeState 属性表示是否支持三种状态

RadioButton 可以使用 GroupName 进行分组,如果入在同一个容器下则表示同一组,比如放在 StackPanel 中或 GroupBox 中

ToolTip 控件

ToolTip 是内容控件,可以包含一个任意类型的内容对象。

<StackPanel Width="200"><Button Width="200"Height="40"Content="Hello"ToolTip="This is my tooltip" /><Button Height="40"><Button.ToolTip><StackPanel><TextBlock Text="Image and text" /><Image Width="100"Height="100"Source="../Images/happyface.jpg"Stretch="UniformToFill" /><TextBlock Margin="3" Text="Image and text" /></StackPanel></Button.ToolTip><Button.Content>I have a fancy tooltip</Button.Content></Button></StackPanel>

🔥📢 不要在工具提示中放置与用户进行交互的控件,因为 ToolTip 窗口不能接收焦点。
👆 此时应该考虑使用 Popup 控件。

ToolTip 属性

  • HasDropShadow: 表示是否有阴影效果 ❓ 好像没有效果
  • Placement: 使用 PlacementMode 枚举值决定如何放置工具提示
  • HorzintalOffset/VerticalOffest: 定位偏移量
  • PlacementTarget: 提示框的相对目标是谁(Placement 值必须是 left/right/top/botton/center) ❓不生效
  • PlacementRectangle: 使用一个范围定义偏移量
  • CustomPopupPlacementCallback: 允许使用代码动态定位工具提示(Placement值发表在是Custom)
  • StaysOpen: 该属性实际不生效
  • IsEnable: 是否禁用
  • IsOpen: 是否显示

ToolTipService 属性
当提示只有文本的时候,可以使用 ToolTipService 更简单的语法
包含两个路由事件:ToolTipOpening/ToolTipClosing

  • InitialShowDelay: 初始的延时时间(毫秒)
  • ShowDuration:鼠标不动时的显示时长,可以理解为是一个超时时间
  • BetweenShowDelay:设置一个延时时间,在这个时间段内移动到另一个具有提示的目标上不会调用InitialShowDelay,即立刻显示提示
  • ToolTip:提示内容
  • HasDropShadow:是否显示阴影
  • ShowOnDisabled:当目标被禁用时,是否可以显示提示
  • Placement/PlacementTarget/PlacementRectangle/VerticalOffset:PlacementTarget 测试在这里是可以生效的

属于内容控件,只能包含一个内容对象。
内容对象存储在 Popup.Child 属性中,而 ToolTip 控件的内容对象存储在 Tooltip.Content 属性中。💡 这两者都可以延伸出窗口的边界。

Popup 控件与 ToolTip 控件的大部分属性都是一样的。重点是理解它们的区别:

  • Popup 不会自动显示,需要使用属性 IsOpen
  • Popup.StaysOpen 属性默认是 true, 会一起显示,如果要关闭则需要将该属性设置为 false (但是这个关闭是在鼠标离开 Popup 的时候才会关闭,也可以理解为是单击其它地方的时候)

Popup 的其它属性:

  • PopupAnimation: 指示以动画方式出现弹窗
    • None
    • Fade: 改变透明度弹出
    • Scroll: 从窗口左上角滑入
    • Slide: 从上向下滑入
    • 💡 使用动画时,AllowsTransparency 属性必须是 true
  • Popup 控件可接收焦点
  • 如果要看子内容,必须设置 Popup 的背景色

特殊容器

💡 具有标题的内容控件,有 Header 属性和 Content 属性,Header 和 Content 属性一样,可以接受任意类型的对象

ScrollViewer

该控件继承自 ContentControl 类,提供了虚拟界面,允许用户围绕更大的元素滚动
VertialScrollBarVisibility 属性说明:

  • Auto: 自动,当内容过大时自动显示,否则隐藏
  • Hide: 隐藏滚动条,但内容可被滚动
  • Disable: 隐藏滚动条,并禁用滚动功能
  • 水平滚动条属性同上

可被代码控制的滚动方式:
方法:

  • LineUp
  • LineDown
  • PageDown
  • PageUp
  • LineLeft
  • LineRight
  • PageLeft
  • PageRight
  • ScrollToXxx

CanContentScroll 属性:当该属性值为true时,每次滚动的时候会定位到下一个子元素身上

GropBox

继承自:HeaderedContentControl 类
它显示为具有圆角和标题的方框
一般用来将 RadioButton 放为一组,但实际上它很少被使用

TabItem

  <TabControl Margin="5" TabStripPlacement="Left"><TabItem IsSelected="True"><!--Header--><TabItem.Header><StackPanel><TextBlock Margin="3">Image and Text Tab Title</TextBlock><Image Height="20" Source="../Images/happyface.jpg" /></StackPanel></TabItem.Header><!--Content--><!--<TabItem.Content></TabItem.Content>--><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" />
</TabControl>

TabStripPlacement: 指示选项上位的位置
IsSelected:指示选项卡是否是选中的

Expander

💡 一个用于折叠或展开子内容的控件
ExpandDirection="Left" 该属性可用于指定折叠的方向

文本控件

三个文本控件:

  • TextBox
  • RichTextBox
  • PasswordBox
TextBox

属性:

  • MaxLength: 字符的最大数量
  • TextWrapping: 换行
  • MinLines: 最小行数
  • MaxLines: 最大行数
  • LineCount: 获取文本中有多少行
  • VerticalScrollBarVisibility/HorizontalScrollBarVisbility: 在支持换行的情况下显示或隐藏滚动条
  • AcceptsRetrun: 支持按下回车键换行
  • AcceptsTabs: 支持键入 Tab 符
  • IsReadOnly: 只读
  • IsEnabled: 禁用

方法:
当支持换行时:

  • LineUp()
  • LineDown()
  • PageUp()
  • PageDown()
  • ScrollToHome()
  • ScrollToEnd()
  • ScrollToLine()
选择文本

属性

  • SelectionStart: 指示从哪个索引开始选择
  • SelectionLength: 选择的长度
  • SelectedText: 被选中的文本
  • AutoWordSelection: 当该属性值为 true 时,每次选中会选择整个单词
  • CanUndo: 当此值为true时,允许用户撤销操作

方法:

  • Undo() 该方法可与 control+z 一起使用,用于撤销用户的操作
  • BeginChange() ❓
  • EndChange() ❓

事件:

  • SelectionChanged: 当选择的内容有变化时

支持拼写检查功能:

  • SpellCheck.IsEnabled: 当该属性值为 true 时,可支持拼写检查
    本功能需要添加 .lex 的扩展文件,只支持四种语言
    略,有需要再查看其具体用法
PasswordBox

属性:

  • PasswordChar: 用于屏蔽密码的字符,如圆点
  • MaxLength: 密码的最大长度

方法:

  • Clear()
  • Paste()
  • SelectAll()

事件:

  • PasswordChanged: 当密码内容发生变化时

关于 System.Security.SecureString 对象
尽管可使用 Password 属性八为普通字符串读取和设置文本,但在内部 PasswordBox 类只使用 System.Security.SecureString 对象。
该对象是纯文本对象。区别是在内存中的存储方式。它以加密方式在内存中保存。用于加密字符串的密钥是随机生成的,存储在一块从来不会写入到磁盘的内存中。最终的结果是即使计算机崩溃,恶意用户也不可能通过检查页面文件来检索密码数据。即使找到,也只能找到加密版本。

列表控件

列表控件如ListBox/ComboBox/ListView/TreeView/ToolBar 都继承自 ItemsControl 对象。
常用的功能是数据源绑定:ItemsSource属性
还需要注意一个功能:继承自 Selector 类的选择器

ListBox

该列表控件允许用户从长度可变的列表中选择一项。
ListBox 的 Items 对象中存储的是 ListBoxItem 对象。
ListBoxItem 继承自 ContentControl 类,所以可以嵌套内容。也可以直接将 UIElement 对象入到 ListBox 中,比如可以直接放 StackPanel

💡 当在项有中其它元素时,该项被选中时,得到的 SelectedItem 是这个子元素
当子项直接使用 StackPanel 时,选中项 SelectedItem 将是 StackPanel;如果子项被放到 ListBoxItem 中时,选中项 SelectedItem 则是 ListBoxItem 对象。

属性:

  • SelectionMode: 当值为 Multiple 或 Extended 时,允许选择多项,前者通过多次单击选择多项,后者需要使用 Ctrl 或 Shift 组合键进行多选
  • SelectedItem: 选中项(单选情况下)
  • SelectedItems: 选中的集合项(多选情况下)
  • IsSelected: 是否被选中

事件:

  • SelectionChanged
  • SelectionChangedEventArgs: 事件参数,该参数中有 RemovedItems 属性,可得到被删除的项,还有 AddedItems 属性,即被加到项中的对象
  • Selected
  • Unselected
ContainerFromElement() 方法 ❓
ListBoxItem item = (ListBoxItem)lst.ContainerFromElement((DependencyObject)lst.SelectedItem);

ComboBox

属性:

  • ComboBoxItem: 子项
  • IsEditable: 当为 true 时,允许用户通过编辑文本选择一项(前提是:子项必须是文本类型)
  • 其它子项的属性使用,也 ListBox 类似

基于范围的控件

  • ScrollBar
  • ProgressBar
  • Slider
    它们都继承自 RangeBase 类,该类又继承自 Control 类。

RangeBase 属性(范围控件都拥有的属性)

  • Value:当前值
  • Maximum:允许的最大值
  • Minimum:允许的最小值
  • SmallChange:Value 属性的最小变化值
  • LargeChange:Value 属性的最大变化值

Slider

滑块。一般用来调整数字值。

属性:

  • Orientation: 水平还是垂直
  • Delay: 单击滑块移动时的延时时间
  • Interval: 手动滑块时的延时时间
  • TickPlacement: 刻度的位置
  • TickFrequency: 刻度的间隔
  • Ticks: 刻度(可自定义刻度集合)
  • IsSnapToTickEnabled: 指示滑块移动的时候是否自动地贴合到刻度上
  • IsSelectionRangeEnabled: 在可选择范围上显示高亮
  • SelectionStart:可被滑动的起始值
  • SelectionEnd: 可被滑动的终点值

ProgressBar

该控件不能与用户进行交互。

属性:

  • Minimum
  • Maximum
  • Value
  • IsIndeterminate: 不按值显示进度,而是重复显示一条脉冲样的外观,一般用来表示程序正在运行中

日期控件

  • Calendar
  • DataPicker

两者的共同属性:

  • DisplayDateStart:显示的第一个日期
  • DisplayDateEnd:显示的最后一个日期
  • BlackoutDates:被禁用的日期范围
  • SelectedDate:选中的日期
  • SelectedDates:选中的日期范围集合
  • DisplayDate:显示的当前日期
  • FirstDayOfWeek:一周的第一天
  • IsTodayHighlighted:当天日期是否高亮

Calendar 属性:

  • DisplayMode:月历显示模式,比如是按年显示还是按月显示
  • SelectionMode:日期的选择模式,一般是单选或者多选

DataPicker 属性:

  • IsDropDownOpen:打开或隐藏下拉视图
  • SelectedDateFormat:显示日期的格式

事件:

  • SelectedDateChanged
  • SelectedDatesChanged
  • DisplayDateChanged
  • CalenderOpended
  • CalendarClosed
  • DateValidationError ❓
private void cr_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{foreach (DateTime selectedDate in e.AddedItems){if ((selectedDate.DayOfWeek == DayOfWeek.Saturday) || (selectedDate.DayOfWeek == DayOfWeek.Sunday)){((Calendar)sender).SelectedDates.Remove(selectedDate);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890234.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5章-路由事件

Handler: 处理器 Preview: 预览、这指隧道 Raise: 引发 Bubble: 冒泡 Handled: 已处理理解路由事件 事件路由允许源自某个元素的事件由另一个元素引发。 定义、注册和封装路由事件 public partial class Window1 : Window {// 定义路由事件,必须是 static readonly// 类型 Rou…

mysql 数据目录

前言 简单介绍一下mysql的数据目录。 正文 对于mysql,我们关心的一般是数据部分,那么关心的就是数据目录。 我们查看一下数据目录的位置。 SHOW VARIABLES LIKE datadir看一下数据目录的位置:再对比一下我们数据库的信息:好像除了这个information_schema 好像都有一个目录。 …

三句话生成 P5.js 粒子特效代码,人人都可以做交互式数字艺术

前几天在上海西岸艺术中心的全球开发者先锋大会GDC2025,通义灵码的老朋友-@同济子豪兄受邀参会,并带领大家观看了本届大会两大重磅看点:具身智能人形机器人和 AI 程序员编程写代码。前几天在上海西岸艺术中心的全球开发者先锋大会GDC2025,通义灵码的老朋友-@同济子豪兄受邀…

使用JAVA调用asmx服务,“http://tempuri.org/”有什么作用?

原文链接:https://bbs.csdn.net/topics/392507481 这个是域名 http://tempuri.org/ 是默认的命名空间.如果是web直接引用不需要管,但有时候别人发布改了这个命名,你动态引用就需要改成跟他一样的了.一般情况下有些人发布没改这个,有些注重网站安全的就修改了这个,给你个照片看…

为什么去IOE化的背景下,还有必要学Oracle

很多人都知道有“去IOE化”这个口号,但事实上,有多少人知道是哪一年提出的这个口号吗?有多少人知道去的哪个IOE吗?现在越来越多的国产数据库出现,还有必要学Oracle、考OCP认证吗? 去IOE化 “去IOE化”这个口号早在2008、2009的时候就提出来了,原因是互联网发展需要、成本…

08 梯度消失与梯度爆炸问题

由反向传播原理可知,梯度的计算遵循链式法则。由于网络层数不断加深,梯度的连乘效应可能会导致梯度呈指数形式衰减,又或以指数形式增加。 前者叫做梯度消失,梯度消失导致网络中的早期层几乎不更新,使得网络难以学习到输入数据的有效特征。可能导致网络权重更新非常缓慢,使…

GAMES101 作业三

重要知识点一 布林冯反射模型 漫反射+高光+环境光重要知识点二 通过作业也对空间中的坐标变换认识更清晰了一点,在摄像空间中进行变换是不对的,需要从原来的三维空间进行变换才对,所以会有一个矫正系数 重要知识点三 在计算光线时,要注意计算向量和单位化 不了解的 对于后两…

写一个简单的hexo-tag-plugin:quote

前置教程 [Akilarの糖果屋 - Akilar.top](https://akilar.top/posts/e2bf861f/) 为啥想写一个quote的标签外挂 我最近在写博客的时候,发现好多时候原生的Hexo标签不是很好用,效果如下。 {% tabs Hexo Block Quote, -1 %}没有提供参数,则只输出普通的 blockquote{% blockquot…

搭建DeepSeek-R1平台

前言 大家用到 DeepSeek-R1 时应该会经常出现下面的情况。但凡多问两个问题,不但缓慢,而且容易出现服务器繁忙的问题:今天教大家一种通过API部署的方式,可以体验满血版的DeepSeek-R1,不仅回答快速,而且不会出现服务器繁忙的情况。 注册账号 首先大家要通过下面的方式,先…

No.16 CSS--背景属性

一、CSS常见的背景属性 background-color: aqua; 设置背景颜色background-image: none; 设置背景图片background-position: 0%; 设置背景图片位置background-repeat: no-repeat; 设置背景图片如何重复填充background-size: 0%; …

Mybatis基础06

动态SQL 介绍 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,…

Spring5基础01

Spring概述简介Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。 很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专…