事件
事件分为:冒泡事件、隧道事件、和直接事件
隧道事件名称始终以Preview开头并首先引发。这使目标元素的父元素有机会在事件到达子元
素之前看到它(因此有Preview前缀)。隧道预览事件紧随冒泡事件之后。
 
在大多数情况下,只处理冒泡事件,隧道事件通常仅在你希望能够阻止该事件时,或者如果你需要父级在正常处理事件之前做某事时才使用。
 
  
 
 View Code
View Code
 
 
 
 
点击黄色的脸部时,执行路由事件顺序:

路由事件可以是冒泡的、隧道的或直接的。
1. 冒泡事件首先查找附加到引发事件的目标元素的事件处理程序,然后查看其父元素,然后查看其父元素的父元素,依此类推,直到到达树的根;此顺序由图  4‑2  中的数字表示。
 2. 隧道事件以相反的方式工作,它首先在树的根部寻找处理程序,然后向下寻找,直至原始元素结束。
 
1 <StackPanel> 2 <Button Width="200" Height="50" PreviewMouseDown="PreviewMouseDownButton" MouseDown="MouseDownButton" > 3 <Grid PreviewMouseDown="PreviewMouseDownGrid" 4 MouseDown="MouseDownGrid"> 5 <Grid.ColumnDefinitions> 6 <ColumnDefinition /> 7 <ColumnDefinition /> 8 </Grid.ColumnDefinitions> 9 <Canvas PreviewMouseDown="PreviewMouseDownCanvas" 10 MouseDown="MouseDownCanvas" 11 Width="20" Height="18" VerticalAlignment="Center"> 12 <Ellipse PreviewMouseDown="PreviewMouseDownEllipse" 13 MouseDown="MouseDownEllipse" 14 x:Name="myEllipse" 15 Canvas.Left="1" Canvas.Top="1" Width="16" Height="16" 16 Fill="Yellow" Stroke="Black" /> 17 <Ellipse Canvas.Left="4.5" Canvas.Top="5" Width="2.5" Height="3" 18 Fill="Black" /> 19 <Ellipse Canvas.Left="11" Canvas.Top="5" Width="2.5" Height="3" 20 Fill="Black" /> 21 <Path Data="M 5,10 A 3,3 0 0 0 13,10" Stroke="Black" /> 22 </Canvas> 23 <TextBlock Grid.Column="1">Click!</TextBlock> 24 </Grid> 25 </Button> 26 <ListBox x:Name="myListBoxt"> 27 </ListBox> 28 <Button VerticalAlignment="Bottom" DockPanel.Dock="Bottom" x:Name="btnClear" Click="btnClear_Click">清除</Button> 29 </StackPanel>
停止事件路由
1 private void PreviewMouseDownCanvas(object sender, System.Windows.Input.MouseButtonEventArgs e) 2 { 3 myListBoxt.Items.Add(myListBoxt.Items.Count.ToString() + "PreviewMouseDownCanvas"); 4 e.Handled= true; 5 }
如果您在Preview处理程序中设置Handled标志,不仅Preview事件的隧道会停止,而且通常会跟
随的相应冒泡事件也不会被引发。这提供了一种停止正常处理事件的方法。
附加事件
<Grid Mouse.PreviewMouseDown="PreviewMouseDownGrid" Mouse.MouseDown="MouseDownGrid">
myEllipse.AddHandler(Mouse.PreviewMouseDownEvent, new MouseButtonEventHandler(PreviewMouseDownEllipse)); myEllipse.AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(MouseDownEllipse));
Mouse.AddPreviewMouseDownHandler(myEllipse, PreviewMouseDownEllipse);
Mouse.AddMouseDownHandler(myEllipse, MouseDownEllipse);
鼠标输入事件
| 事件 | 路由 | 说明 | 
| GotMouseCapture | 冒泡 | 获得鼠标捕获  | 
| LostMouseCapture | 冒泡 | 元素丢失鼠标捕获。 | 
| MouseEnter | 直接的 | 鼠标指针移动到元素中 | 
| MouseLeave | 直接的 | 鼠标指针移出元素。 | 
| PreviewMouseLeftButtonDown,
 MouseLeftButtonDown | 隧道、冒泡  | 当指针在元素内时按下鼠标左键 | 
| PreviewMouseLeftButtonUp, MouseLeftButtonUp | 隧道、冒泡 | 当指针在元素内时释放鼠标左键。 | 
| PreviewMouseRightButtonDown, MouseRightButtonDown | 隧道、冒泡 | 当指针在元素内时按下鼠标右键 | 
| PreviewMouseRightButtonUp, MouseRightButtonUp | 隧道、冒泡 | 当指针在元素内时按下鼠标右键 | 
| PreviewMouseDown,MouseDown | 隧道、冒泡 | 当指针在元素内时按下鼠标按钮(针对任何鼠标按 钮提出)。  | 
| PreviewMouseUp, MouseUp | 隧道、冒泡 | 当指针在元素内时释放鼠标按钮(针对任何鼠标按钮 抬起)。  | 
| PreviewMouseMove, MouseMove | 隧道、冒泡 | 鼠标指针在元素内部移动时移动。 | 
| PreviewMouseWheel, MouseWheel | 隧道、冒泡 | 指针在元素内时鼠标滚轮移动。 | 
| QueryCursor | 冒泡 | 指针在元素内时要确定的鼠标光标形状。  | 
除了与鼠标相关的事件之外,  UIElement还定义了一对指示鼠标指针当前是否在元素上的属
性:  IsMouseOver和IsMouseDirectlyOver。这两个属性之间的区别在于,如果光标位于所讨论
的元素或其任何子元素上,则前者为真,但只有当光标位于所讨论的元素而不是其中之一时,后者
才为真它的孩子。
鼠标捕捉
public partial class MainWindow : Window { public MainWindow(IRegionManager regionManager) { InitializeComponent(); myEllipse.MouseDown += MyEllipse_MouseDown; myEllipse.MouseMove += MyEllipse_MouseMove; myEllipse.MouseUp += MyEllipse_MouseUp; } private void MyEllipse_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { Mouse.Capture(null);//释放鼠标捕获 } private void MyEllipse_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { Debug.WriteLine(Mouse.GetPosition(myEllipse));//得到鼠标相对于myEllipse控件的位置。 } private void MyEllipse_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { Mouse.Capture(myEllipse);//捕获鼠标 } }
Mouse类提供了一个Captured属性,该属性返回当前捕获鼠标的元素;如果未捕获鼠标,则返回  null。您还可以通过使用静态Mouse.DirectlyOver属性发现鼠标当前位于应用程序中的哪个元素(如果有)上。
Mouse提供了五个反映当前按钮状态的属性。每个都返回一个MouseButtonState枚举值,可以是Pressed或Released。其中三个属性(LeftButton、  MiddleButton和RightButton)是不言自明的。
设置鼠标光标状态
private void Button_Click_1(object sender, RoutedEventArgs e) {//鼠标设置成繁忙状态 Mouse.OverrideCursor = Cursors.Wait; } private void Button_Click_2(object sender, RoutedEventArgs e) {//恢复鼠标状态到默认 Mouse.OverrideCursor = null; }
键盘输入事件
| 事件 | 路由 | 说明 | 
| PreviewGotKeyboardFocus, GotKeyboardFocus | 隧道、冒泡 | Element  获得了键盘焦点。 | 
| PreviewLostKeyboardFocus, LostKeyboardFocus | 隧道、冒泡 | 元素失去了键盘焦点。 | 
| GotFocus | 冒泡 | 得到焦点 | 
| LostFocus | 冒泡 | 元素失去了逻辑焦点。 | 
| PreviewKeyDown, KeyDown | 隧道、冒泡 | 按下键。 | 
| PreviewKeyUp, KeyUp | 隧道、冒泡 | 释放键 | 
| PreviewTextInput, TextInput | 隧道、冒泡 | 元素收到文本输入。 | 
private void MyEllipse_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { Debug.WriteLine(Mouse.GetPosition(myEllipse));//得到鼠标相对于myEllipse控件的位置。 //Keyboard.Modifiers 当前按下的功能键:Alt、Shift、Ctrl if ((Keyboard.Modifiers & ModifierKeys.Control)!=0) {//复制,即移动时,同时按下 Control 键。 } //读取单个键的状态 bool homeKeyPressed = Keyboard.IsKeyDown(Key.Home); //获取具有当前焦点的元素 var element= Keyboard.FocusedElement; //为元素设置焦点 Keyboard.Focus(myEllipse); }
命令
标准命令类
| 类名 | 说明 | 
| ApplicationCommands | 有应用程序都通用的命令。包括剪贴板命令、撤消和重做以及文档级操作(打开、关 闭、打印等)。  | 
| ComponentCommands | 用于移动信息的操作,例如上下滚动、移动到末尾和文本选择。 | 
| EditingCommands | 文本编辑命令,例如粗体、斜体、居中和对齐。 | 
| MediaCommands | 媒体播放操作,例如传输(播放、暂停等)、音量控制和曲目选择。 | 
| NavigationCommands | 类似于浏览器的导航命令,例如后退、前进和刷新。 | 
 
<DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="_Edit">
                <MenuItem Header="Cu_t" Command="ApplicationCommands.Cut" />
                <MenuItem Header="_Copy" Command="ApplicationCommands.Copy" />
                <MenuItem Header="_Paste" Command="ApplicationCommands.Paste" />
            </MenuItem>
        </Menu>
        <ToolBarTray DockPanel.Dock="Top">
            <ToolBar>
                <Button Command="Cut" Content="Cut" />
                <Button Command="Copy" Content="Copy" />
                <Button Command="Paste" Content="Paste" />
            </ToolBar>
        </ToolBarTray>
        <TextBox />
    </DockPanel>
 
                    
                     
                    
                 
                    
                 
 
         
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号