WPF事件处理器+x名称空间
目录
编辑
一、事件处理器知识点
1. XAML中的事件绑定
2. C#中的事件处理方法
3. 方法签名解释
4. 命名规范
工作流程
二、导入引用名称空间
三、x名称空间及其常用元素
(1)x名称空间的由来和作用
(2)x名称空间里都有些什么
1. Attribute(属性)
2. 标签扩展
3. XAML指令元素
使用特点
(3)x:ClassModifier
(4)x:Name
使用场景区别
x:Name 的两个作用
“如果对象有Name属性,会自动设置为相同的值”是什么意思
为什么要设置Name属性?
(4)x:FieldModifier
作用:控制XAML中控件生成的C#字段的访问级别
访问级别冲突
XAML是声明性语言,每见到一个标签声明一个实例。
每个XAML标签 = 创建一个对象
举例说明
XAML代码(声明性):
<Grid><Button Content="点击我"/><TextBox Text="输入框"/>
</Grid>
等价的C#代码(命令性):
Grid grid = new Grid(); // <Grid> 创建Grid实例
Button button = new Button(); // <Button> 创建Button实例
button.Content = "点击我";
TextBox textBox = new TextBox(); // <TextBox> 创建TextBox实例
textBox.Text = "输入框";grid.Children.Add(button);
grid.Children.Add(textBox);
一、事件处理器知识点
1. XAML中的事件绑定
<Button Click="button1_Click"/>
Click
是事件名button1_Click
是对应的C#方法名- 这样就把按钮点击和后台方法关联起来了
2. C#中的事件处理方法
private void button1_Click(object sender, RoutedEventArgs e)
{MessageBox.Show("Hello WPF!");
}
3. 方法签名解释
object sender
: 触发事件的控件(这里是那个Button)RoutedEventArgs e
: 事件相关信息- 返回类型必须是
void
4. 命名规范
- 通常用:
控件名_事件名,比如
button1_Click
工作流程
- 用户点击按钮
- WPF查找
button1_Click
方法 - 执行方法内的代码
- 显示消息框
二、导入引用名称空间
三、x名称空间及其常用元素
(1)x名称空间的由来和作用
xmlns:x
是XAML的标准名称空间声明x
是约定俗成的前缀名,代表XAML本身的功能- 这个URL
http://schemas.microsoft.com/winfx/2006/xaml
是微软定义的XAML规范地址
(2)x名称空间里都有些什么
x名称空间里的内容分为三大类:
1. Attribute(属性)
最常用的一类,直接作为属性使用:
x:Name
- 给控件命名,方便代码访问x:Key
- 资源的唯一标识符x:FieldModifier
- 控制字段访问级别x:Shared
- 控制资源是否共享x:Subclass
- 指定子类x:TypeArguments
- 泛型类型参数x:Uid
- 本地化标识符
2. 标签扩展
需要用花括号 {}
语法:
x:Null
- 表示空值{x:Null}
x:Static
- 访问静态成员{x:Static local:MyClass.StaticProperty}
x:Type
- 获取类型信息{x:Type Button}
3. XAML指令元素
作为XML元素使用:
x:Code
- 内嵌代码块x:XData
- 包装原始数据
使用特点
- Attribute: 直接写在标签上
<Button x:Name="btn1"/>
- 标签扩展: 用花括号
Value="{x:Static SystemColors.ControlBrush}"
- 指令元素: 作为子元素
<x:Code>...</x:Code>
(3)x:ClassModifier
class modify在编程中是指类修饰符,它主要用于控制类的访问级别。当类的class modifier设为public时,意味着该类可以从程序集外部访问;若设为private,则表示该类只能在当前程序集中被访问,外部无法直接访问。
(4)x:Name
使用场景区别
1. WPF控件(派生自FrameworkElement)
x:Name="btn1"
和Name="btn1"
效果相同- 一般WPF控件都可以用两种方式
2. 非WPF控件(不派生自FrameworkElement)
- 只能用
x:Name="xxx"
- 不能用
Name
属性
x:Name 的两个作用
1. 声明引用变量
<Button x:Name="myButton"/>
- 在C#代码中可以直接用
myButton
访问这个按钮 - 变量名就是x:Name的值
2. 设置Name属性
- 如果对象有Name属性,会自动设置为相同的值
- 相当于
Name="myButton"
“如果对象有Name属性,会自动设置为相同的值”是什么意思
XAML代码:
<Button x:Name="saveButton" Content="保存"/>
WPF自动做了两件事:
1. 创建C#变量(这个总是会做的)
Button saveButton; // 让你在C#代码中可以用saveButton访问
2. 设置Name属性(只有控件有Name属性才会做)
saveButton.Name = "saveButton"; // 把控件本身的Name属性也设置了
在C#代码中测试:
private void TestButton()
{// 第1个作用:可以通过变量访问saveButton.Content = "新内容";// 第2个作用:Name属性也被设置了MessageBox.Show(saveButton.Name); // 显示 "saveButton"
}
- 变量名 和 Name属性值 是同一个字符串
x:Name="abc"
→ 变量名是abc
,控件的Name属性也是"abc"
为什么要设置Name属性?
有些WPF功能需要通过Name属性查找控件:
// 通过Name属性查找控件
Button found = (Button)this.FindName("saveButton");
简单说:x:Name既创建了变量,又给控件起了内部名字。
(4)x:FieldModifier
作用:控制XAML中控件生成的C#字段的访问级别
XAML代码:
<TextBox x:FieldModifier="private" x:Name="textBox1" .../>
C#代码:
WindowHappy wh = new WindowHappy();
wh.textBox1.Text = "I'm happy!"; // 这行代码有问题!
wh.ShowDialog();
访问级别冲突
x:FieldModifier="private"
生成私有字段- 但C#代码试图从外部访问
wh.textBox1
- private字段不能被外部访问!