学海无涯

导航

事件

事件分为:冒泡事件、隧道事件、和直接事件

隧道事件名称始终以Preview开头并首先引发。这使目标元素的父元素有机会在事件到达子元
素之前看到它(因此有Preview前缀)。隧道预览事件紧随冒泡事件之后。
大多数情况下,只处理冒泡事件,隧道事件通常仅在你希望能够阻止该事件时,或者如果你需要父级在正常处理事件之前做某事时才使用。
 
 

 

 点击黄色的脸部时,执行路由事件顺序:

路由事件可以是冒泡的、隧道的或直接的。
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>
View Code

 停止事件路由

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>

 

posted on 2023-01-08 11:57  宁静致远.  阅读(93)  评论(0)    收藏  举报