• Silverlight学习点滴系列(五)


    1)回忆
       昨天讲到了对Silverlight中的控件的样式的复用,样式的复用可以有效的减少相同代码的重用。也可以使得在自定义控件页面的代码显得更加简洁明了。
    2)对TextBox的鼠标事件
       这里讲到对TextBox的鼠标事件,当然不是狭义的只针对这个控件,我只是拿这个来做下例子,当然你可以在其他更多的控件上面做鼠标事件。比如在Button等上面。
       对TextBox做鼠标移入和移出的效果,在XAML文件中的代码如下:
      
     <TextBox Grid.Column="1" FontSize="15" 
     Background
    ="White" MouseEnter="TextBox_MouseEnter"
     MouseLeave
    ="TextBox_MouseLeave"/>

       跟Silverlight学习点滴系列(二)中的按钮事件一样,右键TextBox_MouseEnter和TextBox_MouseLeave,选择“导航到事件处理程序”。
       编写事件处理程序:

            private void TextBox_MouseEnter(object sender, MouseEventArgs e) {
                TextBox txtbox 
    = sender as TextBox;
                txtbox.Background 
    = new SolidColorBrush(Colors.Red);
            }

            
    private void TextBox_MouseLeave(object sender, MouseEventArgs e) {
                TextBox txtbox 
    = sender as TextBox;
                txtbox.Background 
    = new SolidColorBrush(Colors.Yellow);
            }

    以下鼠标移上去的运行的效果:
     

    以下是鼠标移出的效果:



    当然上面的这样鼠标事件是我们平时用的最多的,也是最直观的鼠标事件。下面我们来看下在代码中管理事件,也就是说相当于在后台代码中注册事件,我们还是用原来的这个TextBox来做文章,在这里,我们在XAML文件中去掉 MouseEnter="TextBox_MouseEnter" MouseLeave="TextBox_MouseLeave"这两个事件声明,然后为了在后台代码中注册事件,我们需要在XAML中为TextBox加上一个x:Name属性我们设置为 “txtbox”。
                <TextBox x:Name="txtbox" Grid.Column="1" FontSize="15" 
                Background
    ="White"/>

    然后在后台代码中注册事件:
            public MainPage() {
                InitializeComponent();
                txtbox.MouseEnter += new MouseEventHandler(TextBox_MouseEnter);
                txtbox.MouseLeave += new MouseEventHandler(TextBox_MouseLeave);
            }


    TextBox_MouseEnter和TextBox_MouseLeave还是没有变化,所以运行的效果跟上面还是一样的。

    在很多时候我们需要获取鼠标移动的数据,比如说鼠标的坐标,特别是我们在GIS系统中会用到,或者在类如Google地图中会有类似的场景。我们用第二种事件注册的方式来获取数据。
    首先在XAML中的代码:

                <TextBox x:Name="txtbox" Grid.Column="1" FontSize="15" 
                Background
    ="White"/>

            
    <Canvas>
                
    <TextBlock Canvas.Left="300" Canvas.Top="100" x:Name="YeanTxt" 
                 Margin
    ="10" Foreground="White" Text="鼠标的坐标"/>
            
    </Canvas>
    用YeanTxt这样一个TextBlock来显示这个鼠标的坐标。这里我在Grid里面加了一个Canvas,因为如果要直接加TextBlock的话,需要在Grid里面加一行,然后还写Grid.Row=.....为了偷懒,就直接加了个Canvas,再设置一下TextBlock的Canvas.Left和Canvas.Top来定位一下。
    在后台代码中(这里真正的不能叫后台代码,因为在Silverlight中没有CodeBehind的概念了,为了与.net的Web应用程序统一一下,暂时我们就说成后台代码,但是读者心中一定要明确真正的并不是CodeBehind,在这个系列中我也都会将事件代码说成是后台代码),写入鼠标移动的事件:
            public MainPage() {
                InitializeComponent();
                txtbox.MouseEnter 
    += new MouseEventHandler(TextBox_MouseEnter);
                txtbox.MouseLeave 
    += new MouseEventHandler(TextBox_MouseLeave);
                txtbox.MouseMove
    +=new MouseEventHandler(txtbox_MouseMove);
            }

            
    private void txtbox_MouseMove(object sender, MouseEventArgs e) {
                Point p 
    = e.GetPosition(null);
                YeanTxt.Text 
    = String.Format("鼠标坐标位置:X:{0},Y:{1}", p.X, p.Y);
            }
    先在MainPage中注册事件,然后在编写事件代码,在代码中,声明一个点坐标,然后通过e.GetPosition来获取鼠标坐标,是不是很简单!!
    这里我们的null参数代表我们获取的鼠标是针对整个Silverlight插件的,也就是说针对浏览器屏幕的。
    运行的效果如下:


    当然我们可以针对TextBox本身来取鼠标位置,这个可能更有用处吧。那我们直接把那个null参数改成我们的TextBox的x:Name就可以了。
            private void txtbox_MouseMove(object sender, MouseEventArgs e) {
                Point p 
    = e.GetPosition(txtbox);
                YeanTxt.Text 
    = String.Format("鼠标坐标位置:X:{0},Y:{1}", p.X, p.Y);
            }
    运行的效果当然是以TextBox为边界的鼠标的位置咯:


        最后说下,Silverlight中的事件路由,事件路由可以分为三种:直接路由,冒泡路由,和隧道路由。在Silverlight中的路由方式是冒泡路由,当然大部分的冒泡方式都是冒泡路由,其他两种路由方式我这里就不介绍了,可以到MSDN事件路由里面去查看。我这里就讲下冒泡路由,冒泡路由就是可以在父节点中可以获取和处理子节点的事件。举个例子。我在Canvas中有一个Border控件,然后在Border中有一个Button控件。然后我在Canvas中设置一个Button_Click事件的话,然后我点击Button但是我在Button中没有设置Button_Click处理事件,在Border中也没有设置,这个时候,这个事件就可以从Button->Border->Canvas这样的冒泡的方式到最外面的节点来处理。
       我们针对我们的这个工程,我们在Canvas中增加一个MouseLeftButtonDown事件,这样如果我们在它中间的控件上单击鼠标左键,这时候,如果在这个中间控件中没有声明MouseLeftButtonDown事件的话,那么这个事件将路由到Canvas中处理。看XAML中代码:

            <Canvas Background="Blue" x:Name="YeanCanvas" MouseLeftButtonDown="YeanCanvas_MouseLeftButtonDown">
                
    <Rectangle Canvas.Left="300" Canvas.Top="300" x:Name="YeanRec" 
                 Width
    ="150" Height="100" Fill="Green"/>
                
    <TextBlock Canvas.Left="300" Canvas.Top="100" x:Name="YeanTxt" 
                 Margin
    ="10" Foreground="White" Text="鼠标的坐标"/>
            
    </Canvas>

    这里YeanTxt是用来显示信息的,YeanRec是来显示那个事件的一个矩形,当然YeanTxt也是可以来演示的啦。废话写了一句。呵呵。
    在处理那个MouseLeftButtonDown事件:

            private void YeanCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
                YeanTxt.Text 
    = "您点击的是:"+(e.OriginalSource as FrameworkElement).Name
                    
    +"坐标是:X,Y=" + e.GetPosition(e.OriginalSource as FrameworkElement).ToString();
            }
    看下显示效果:


    当点击矩形的时候YeanTxt中会显示点击的是矩形,坐标是....这个时候,将鼠标的点击事件路由到最外面的节点上了。



    当点击Canvas时候,显示的是点击了Canvas,坐标是....这个时候就是自身的事件咯!
     今天就到这里吧……好迟了,明天还要上班……
    今天讲到了鼠标的事件,您自己总结一下吧。我总结了有四种,呵呵。留点给你自己去想想,哪四种。哈哈。
  • 相关阅读:
    npm修改为淘宝源
    将蓝牙rssi(信号强度)转换成距离
    goland 可用注册码(license)
    用爬虫实现验证码识别并模拟登陆和cookie操作、代理操作、线程池
    爬虫概述
    初识ES()
    ansible中的playbook(剧本)
    ansible中File模块、Fetch模块、Yum模块、Pip模块、Service模块、Cron模块、User模块、Group模块
    ansible的安装与介绍、host-pattern格式、ansible的command模块、ansible的shell模块、ansible的script模块、ansible的copy模块
    Flask中的before_request装饰器和after_request装饰器以及WTForms组件
  • 原文地址:https://www.cnblogs.com/UpThinking/p/1570707.html
Copyright © 2020-2023  润新知