WPF学习(8)- Button按钮

1. 用法解析

Button因为继承了ButtonBase,而ButtonBase又继承了ContentControl,所以,Button可以通过设置Content属性来设置要显示的内容。例如

xml 复制代码
<Button Content="确定"/>

我们使用Button的时机,通常是鼠标点击事件需要有响应操作时,所以,Button的Click事件是最好的选择。

csharp 复制代码
public class Button : ButtonBase
{
    public static readonly DependencyProperty IsDefaultProperty;
    public static readonly DependencyProperty IsCancelProperty;
    public static readonly DependencyProperty IsDefaultedProperty;
 
    public Button();
 
    public bool IsDefault { get; set; }
    public bool IsCancel { get; set; }
    public bool IsDefaulted { get; }
 
    protected override void OnClick();
    protected override AutomationPeer OnCreateAutomationPeer();
 
}
  • IsDefault:用户通过按 ENTER 键时调用的默认按钮。
  • IsCancel:用户可以通过按 ESC 键来激活取消按钮。
  • IsDefaulted:获取按钮是否为按 ENTER 键时调用的默认按钮。

2. 案例

前端代码

xml 复制代码
    <Button x:Name="_button" 
            Content="退出" 
            Width="100" 
            Height="25" 
            Click="_button_Click" IsDefault="True"/>

后端代码

csharp 复制代码
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void _button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }

3. 属性解析

x:Name和Name的区别

第一个设置是x:Name="_button"。首先要解释x:Name是什么意思。在这里的x表示一个命令空间,也就是xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml",Name指的是这个控件的名称。请注意,由于Button继承了FrameworkElement类,而FrameworkElement类也有一个Name属性,但是这里设置的x:Name="_button"并不是引用了FrameworkElement类的Name属性,而是指在xaml中为Button定义了一个叫"_button"的名称,并把这个"_button"映射到了Button的Name属性上,以便于我们在后端可以通过"_button"去引用这个按钮。

也就是说,如果某个控件本身也有一个Name属性,那么前端的x:Name就赋值给控件Name属性。

Content属性

用来设置Button的显示内容,除了是字符串,也可以设置为其它内容,比如一个图标、一个其它元素。

Width属性

Width也不是Button本身的属性,而是FrameworkElement的宽度,由于Button继承了FrameworkElement,所以Width就成了按钮的宽度属性。

Height属性

与上面的Width类似,同属于FrameworkElement的高度属性,在此成了Button的高度属性。

Click事件

Click是一个事件,但不是Button的事件,而是它的基类ButtonBase的事件,事件和委托概念关系密切,因为要订阅一个事件,需要写一个回调函数,而这个回调函数的签名要和这个事件的声明委托签名保持一致。

IsDefault属性

这个属性是Button自身的属性,这里设置为true,表示这个button是一个默认按钮。

this.Close()表示关闭当前窗体。

通过C#代码订阅事件

还可以通过C#代码提供的事件订阅符号+=去订阅事件,将上面的例子修改一下,去掉在xaml中的订阅方式,在后端代码的构造函数中订阅事件。

前端代码

xml 复制代码
<Button Name="_button" 
        Content="退出" 
        Width="100" 
        Height="25" 
        IsDefault="True"/>

后端代码

csharp 复制代码
 /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            _button.Click += _button_Click;
        }
 
        private void _button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
相关推荐
for_ever_love__11 小时前
python基础语法学习: 动态类型
开发语言·python·学习
敲代码的嘎仔12 小时前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
边境悍匪13 小时前
蜗牛学苑 Java 智能体学习 Day40|Vue 工程化与 ElementPlus 思维导图复盘
java·vue.js·学习
传奇开心果编程14 小时前
【xilem0.4基础语法学与练】第22课:on_click / on_change 与手势系统的实战
学习·rust·前端框架
Cho1yon14 小时前
【AI Agent 第十五期: AI Agent 从 0 到 1 系统学习大纲】
javascript·人工智能·学习
my_daling16 小时前
紫光FPGA远程升级注意事项(关于GTP_CFGCLK原语使用问题)
笔记·学习·fpga开发
zr想努力17 小时前
GAS学习(UE5自用)
学习·ue5
她说..17 小时前
MySQL JSON 处理学习文档
学习·mysql·json
资讯综合17 小时前
一年级数学机构怎么选?与学习阶段相匹配的线上思维课程与线下机构差异分析
学习
M78佐菲17 小时前
51单片机学习笔记(2)
linux·笔记·嵌入式硬件·学习·51单片机