属性
定义:属性是对XAML元素特征进行描述的方法;属性不允许在XAML中重复设置多次;允许在托管代码中改变元素的属性值;
分类:基本属性,附加属性,依赖属性;
每个属性对应一个属性值,属性值类型必须与属性匹配
基本属性:
<Button Width="100" Height="50" Content="Button" Background="Pink"/>
附加属性:就是说一个熟悉本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性(表现出来就是被环境赋予的属性)称为附加属性。
<DockPanel>
<!--DockPanel.Dock 为附加属性-->
<Grid DockPanel.Dock="Left" Width="50" Background="Pink"></Grid>
<Grid DockPanel.Dock="Bottom"></Grid>
</DockPanel>
依赖属性:依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值;当依赖属性的值发生改变,wpf就会自动根据属性的元数据触发一系列的动作。
<Grid>
<Grid.Resources>
<LinearGradientBrush x:Key="bgBrush" StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="Red" Offset="0"/>
<GradientStop Color="Orange" Offset="0.2"/>
<GradientStop Color="Yellow" Offset="0.4"/>
<GradientStop Color="Green" Offset="0.6"/>
<GradientStop Color="Blue" Offset="0.8"/>
<GradientStop Color="Violet" Offset="1"/>
</LinearGradientBrush>
</Grid.Resources>
<Button Background="{StaticResource bgBrush}"/>
</Grid>
事件
定义:
- 事件是Windows消息机制中重要概念之一,最常见的人机交互手段之一;
- XAML帮助应用管理用户输入,执行不同的行为;
- 引入增强型事件处理系统-Routed Event(路由事件);
- 时间常常被用于控制更改通知操作;
看下面一个例子:点击按钮myButton弹出一个提示框
<XAML代码>
<Button Name="myButton" Content="myButton" Width="100" Height="40" Click="Button_Click"/>
<C#代码>
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show((sender as Button).Content.ToString());
}
结果视图:
在Logical Tree上导航或查找元素,可以借助LogicalTreeHelper类的static方法来实现。
- BringIntoView:把选定元素带进用户可视区域,经过用于可滚动的视图。
- FindLogicalNode:按给定名称(Name属性值)查找元素,包括子级树上的元素。
- GetChildren:获取所有直接子级元素。
- GetParent:获取直接父级元素。
- 路由事件
路由事件与直接事件的区别:
直接事件激发时,发送者直接将消息通过事件订阅交给事件响应者,事件响应者使用其事件处理器方法对事件的发生做出响应、驱动程序逻辑按客户需求运行;
路由事件的事件拥有者和事件响应者之间则没有直接显示的订阅关系,事件的拥有者只负责激发事件,事件将由谁响应他并不知道,事件的响应者则安装有事件侦听器,针对类事件进行侦听,当有此类事件传递至此时事件响应者就使用事件处理器来处理并决定事件是否可以继续传递。
路由事件分为两种事件:
Bubble,冒泡式:路由事件由事件的激发者出发向他的上级容器一层一层路由,直到最外层。
Tunnel,隧道式:事件的路由方式刚好和冒泡式相反。从最外层向激发事件的控件移动。
看下面一个例子:当点击YseTB时,MouseUp事件就会沿着YseTB-> StackPanelTB-> BorderTB->Window路线传送。
<XAML代码>
<Grid>
<Border Name="BorderTB" Height="50" Width="100" BorderBrush="Pink" BorderThickness="1">
<StackPanel Name="StackPanelTB" Background="LightBlue" Orientation="Horizontal" MouseUp="StackPanel_MouseUp">
<TextBlock Name="YseTB" Width="50" MouseUp="YseTB"
Background="AliceBlue">Yes</TextBlock>
</StackPanel>
</Border>
</Grid>
<C#代码>
private void StackPanel_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("StackPanelTB");
}
private void YseTB_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("YseTB");
}
结果视图:
中断路由事件
<C#代码>
private void StackPanel_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("StackPanelTB");
}
private void YseTB_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("YseTB");
e.Handled = true;
}