zoukankan      html  css  js  c++  java
  • 路由事件

    路由事件的处理模型常用的有两种:

      冒泡事件: 由子控件位次向父容器传递,大部分的路由事件都是冒泡事件

      隧道事件: 由父容器位次向其子容器、控件传递,一般PreXXX事件属性隧道事件

    下面提供键盘事件和鼠标事件

    键盘的隧道事件

    <Window x:Class="Event.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="KetEvent" Height="350" Width="480" WindowStartupLocation="CenterScreen" 
            Focusable="True" PreviewKeyDown="Window_PreviewKeyDown">
        <Canvas>        
            <!--..-->
            <TextBox x:Name="txtMessage" Margin="5" Width="300" Height="20" Canvas.Top="10" KeyDown="txtMessage_KeyDown"/>
            <TextBox x:Name="txtVolumeUp" Margin="5" Width="300" Height="20" Canvas.Top="40" KeyDown="txtVolumeUp_KeyDown"/>
            <TextBox x:Name="txtVolumeDown" Margin="5" Width="300" Height="20" Canvas.Top="70" KeyDown="txtVolumeDown_KeyDown"/>
        </Canvas>
    </Window>

    后台

    /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Up)
                { 
                    //按下"静音"键
                    txtMessage.Text = "Up";
                    e.Handled = true;
                }
                else if (e.Key == Key.Down)
                { 
                    //按下"增大音量"键
                    txtVolumeUp.Text = "Down";
                    e.Handled = true;
                }
                else if (e.Key == Key.Left)
                { 
                    //按下"减小音量"键
                   txtVolumeDown.Text = "Left";
                    e.Handled = true;
                }
            }
    
            private void txtMessage_KeyDown(object sender, KeyEventArgs e)
            {
                MessageBox.Show("Message");
            }
    
            private void txtVolumeUp_KeyDown(object sender, KeyEventArgs e)
            {
                MessageBox.Show("VolumeUp");
            }
    
            private void txtVolumeDown_KeyDown(object sender, KeyEventArgs e)
            {
                MessageBox.Show("VolumeDown");
            }
    
           
        }

    在窗体上使用

    PreviewKeyDown="Window_PreviewKeyDown"事件,事件前面使用PreView代表隧道事件下面。
    KeyDown="txtMessage_KeyDown"事件,属于冒泡事件

    鼠标的事件

    <Window x:Class="MouseEvent.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        
        <Canvas PreviewMouseDown="Canvas_PreviewMouseDown">
            <TextBox x:Name="txtMessage" Canvas.Left="50" Canvas.Top="46" Width="150" Height="20"/>
            <Rectangle Canvas.Left="246" Canvas.Top="46" Height="118" 
                       x:Name="mainRectangle" Stroke="Black" Width="200" Fill="White"
                       MouseEnter="mainRectangle_MouseEnter" MouseLeave="mainRectangle_MouseLeave"
                       MouseMove="mainRectangle_MouseMove" MouseDown="mainRectangle_MouseDown"
                       MouseWheel="mainRectangle_MouseWheel"/>    
        </Canvas>
    
    </Window>

    后台代码

      /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void mainRectangle_MouseEnter(object sender, MouseEventArgs e)
            {
                //鼠标进入控件时,控件的颜色为红色
                mainRectangle.Fill = new SolidColorBrush(Colors.Red);
            }
    
            private void mainRectangle_MouseLeave(object sender, MouseEventArgs e)
            {
    
                //鼠标离开控件时,控件的颜色为红色
                mainRectangle.Fill = new SolidColorBrush(Colors.White);
            }
    
            private void mainRectangle_MouseDown(object sender, MouseButtonEventArgs e)
            {
                //获取点击的鼠标的按钮
                MouseButton button = e.ChangedButton;
                txtMessage.Text += "
    ";
                txtMessage.Text += string.Format("Mouse Button is {0}", button.ToString());
    
            }
    
            private void mainRectangle_MouseMove(object sender, MouseEventArgs e)
            {
                //获取基于Rectangle的鼠标的坐标
                Point pointBaseRectange = Mouse.GetPosition(mainRectangle);
                txtMessage.Text = string.Format("Mouse Position (Base the Rectangle) is ({0},{1})", pointBaseRectange.X, pointBaseRectange.Y);
                txtMessage.Text += "
    ";
    
                //获取基于窗体的鼠标的坐标
                Point pointBaseWindow = Mouse.GetPosition(this);
                txtMessage.Text += string.Format("Mouse Position(Base thi Window) is ({0,1})", pointBaseWindow.X, pointBaseWindow.Y);
    
            }
    
            private void mainRectangle_MouseWheel(object sender, MouseWheelEventArgs e)
            {
                if (e.Delta > 0)
                { 
                    //如果向上推动滚轮,图形的宽度增加
                    mainRectangle.Width++;
                }
    
                if (e.Delta < 0)
                { 
                    //如果向下推动滚轮,图形的宽度减小
                    mainRectangle.Width--;
                }
            }
     
        }

    在窗体上使用

    PreviewMouseDown="Canvas_PreviewMouseDown"事件,事件前面使用PreView代表隧道事件下面。
    MouseDown="mainRectangle_MouseDown"事件,属于冒泡事件
  • 相关阅读:
    MS SQLSERVER 第三天
    MS SQLSERVER 第二天
    今天开始我的 MSSQLSERVER 之旅
    从今天开始就正式我的博客之旅
    mac 本地搭建mybatisGenerator代码生成环境
    idea中git远程版本回退
    Junit调试解决本地多线程异步调用
    Lambda表达式总结
    JDK8函数式编程之Stream API
    MySql分页查询慢的解决方案
  • 原文地址:https://www.cnblogs.com/hdsong/p/5076555.html
Copyright © 2011-2022 走看看