微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

稳扎稳打Silverlight(13) - 2.0交互之鼠标事件和键盘事件

[索引页]
[源码下载]


稳扎稳打Silverlight(13) - 2.0交互之鼠标事件和键盘事件


作者: webabcd


介绍
Silverlight 2.0 人机交互:响应用户的鼠标操作和键盘操作
    MouseEnter - 鼠标进入时触发的事件(显然,此事件不能冒泡)
    MouseLeave - 鼠标离开时触发的事件(显然,此事件不能冒泡)
    MouseLeftButtonDown - 鼠标左键单击按下时触发的事件
    MouseLeftButtonUp - 鼠标左键单击按下并放开时触发的事件
    MouseMove - 鼠标移动时触发的事件
    MouseEventArgs.GetPosition() - 鼠标相对于指定元素的坐标
    MouseButtonEventArgs.Handled - 此事件是否已被处理
    KeyDown - 鼠标按下时触发的事件
    KeyUp - 鼠标按下并放开时触发的事件
    KeyEventArgs.Key - 与事件相关的键盘的按键 [System.Windows.Input.Key枚举]
    KeyEventArgs.Handled - 是否处理过此事件
    System.Windows.Input.Keyboard.Modifiers - 当前按下的辅助键 [System.Windows.Input.ModifierKeys枚举]


在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html


示例
1、Mouse.xaml

@H_404_44@

< UserControl  x:Class ="Silverlight20.Interactive.Mouse"

@H_404_44@

    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  

@H_404_44@

    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >

@H_404_44@

    

@H_404_44@

    
<!-- 路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件 -->

@H_404_44@

    

@H_404_44@

    
<!--

@H_404_44@

    MouseLeftButtonDown, MouseLeftButtonUp和MouseMove均为向上冒泡的路由事件

@H_404_44@

    本例的事件路由为:Ellipse -> StackPanel -> UserControl 或 Rectangle -> Canvas -> StackPanel -> UserControl

@H_404_44@

    如果不想向上冒泡,则可以使用 MouseButtonEventArgs.Handled = true 告知事件已被处理

@H_404_44@

    
-->

@H_404_44@

    
< StackPanel  HorizontalAlignment ="Left"  MouseLeftButtonDown ="StackPanel_MouseLeftButtonDown"   >

@H_404_44@


@H_404_44@

        
<!--

@H_404_44@

        MouseEnter - 鼠标进入时触发的事件(显然,此事件不能冒泡)

@H_404_44@

        MouseLeave - 鼠标离开时触发的事件(显然,此事件不能冒泡)

@H_404_44@

        

@H_404_44@

        MouseLeftButtonDown - 鼠标左键单击按下时触发的事件

@H_404_44@

        MouseLeftButtonUp - 鼠标左键单击按下并放开时触发的事件

@H_404_44@

        MouseMove - 鼠标移动时触发的事件

@H_404_44@

        
-->

@H_404_44@

        
< Ellipse  x:Name ="ellipse"  Width ="200"  Height ="100"  Fill ="Red"  Margin ="5"  

@H_404_44@

            MouseEnter
="ellipse_MouseEnter"  

@H_404_44@

            MouseLeave
="ellipse_MouseLeave"

@H_404_44@

            MouseLeftButtonDown
="ellipse_MouseLeftButtonDown"

@H_404_44@

            MouseLeftButtonUp
="ellipse_MouseLeftButtonUp"

@H_404_44@

        
>

@H_404_44@

        
</ Ellipse >

@H_404_44@


@H_404_44@

        
< Canvas  Margin ="5" >

@H_404_44@


@H_404_44@

            
<!-- 用于演示拖放的矩形 -->

@H_404_44@

            
< Rectangle  x:Name ="rectangle"  Fill ="Blue"  Width ="50"  Height ="50"

@H_404_44@

                MouseLeftButtonDown
="rectangle_MouseLeftButtonDown"

@H_404_44@

                MouseLeftButtonUp
="rectangle_MouseLeftButtonUp"

@H_404_44@

                MouseMove
="rectangle_MouseMove"

@H_404_44@

            
/>

@H_404_44@

            

@H_404_44@

        
</ Canvas >

@H_404_44@


@H_404_44@

    
</ StackPanel >

@H_404_44@

</ UserControl >

@H_404_44@


Mouse.xaml.cs

@H_404_44@

using  System;

@H_404_44@

using  System.Collections.Generic;

@H_404_44@

using  System.Linq;

@H_404_44@

using  System.Net;

@H_404_44@

using  System.Windows;

@H_404_44@

using  System.Windows.Controls;

@H_404_44@

using  System.Windows.Documents;

@H_404_44@

using  System.Windows.Input;

@H_404_44@

using  System.Windows.Media;

@H_404_44@

using  System.Windows.Media.Animation;

@H_404_44@

using  System.Windows.Shapes;

@H_404_44@


@H_404_44@

namespace  Silverlight20.Interactive

{

    
public partial class Mouse : UserControl

    
{

        
public Mouse()

        
{

            InitializeComponent();

        }


        
void ellipse_MouseEnter(object sender, MouseEventArgs e)

        
{

            ellipse.Fill 
= new SolidColorBrush(Colors.Yellow);

        }


        
void ellipse_MouseLeave(object sender, MouseEventArgs e)

        
{

            ellipse.Fill 
= new SolidColorBrush(Colors.Red);

        }


        
private void ellipse_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

        
{

            ellipse.Fill 
= new SolidColorBrush(Colors.Yellow);

        }


        
private void ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        
{

            ellipse.Fill 
= new SolidColorBrush(Colors.Blue);


            
// MouseButtonEventArgs.Handled - 此事件是否已被处理

            
//     false - 未被处理,事件的路由为向上冒泡

            
//     true - 已被处理,事件的路由为不再冒泡

            e.Handled = true;

        }


        
private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        
{

            
// 如果鼠标单击 rectangle 对象,则 会 执行到此句

            
// 如果鼠标单击 ellipse 对象,则 不会 执行到此句,因为之前 ellipse 对象的 MouseLeftButtonDown 事件中已经设置 e.Handled = true ,所以事件不会冒泡至此

            ellipse.Fill = new SolidColorBrush(Colors.Black);

        }

        



        
// 是否正在捕获鼠标

        private bool _isMouseCaptured;


        
// 鼠标垂直方向上的坐标

        private double _mouseY;


        
// 鼠标水平方向上的坐标

        private double _mouseX;


        
private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        
{

            
// MouseButtonEventArgs.GetPosition() - 鼠标相对于指定元素的坐标

            _mouseY = e.GetPosition(null).Y;

            _mouseX 
= e.GetPosition(null).X;


            
// CaptureMouse() - 在指定的元素上捕获鼠标

            rectangle.CaptureMouse();

            _isMouseCaptured 
= true;

        }


        
public void rectangle_MouseMove(object sender, MouseEventArgs e)

        
{

            
if (_isMouseCaptured)

            
{

                
// 移动前和移动后的鼠标 垂直方向 和 水平方向 的位置的差值

                double v = e.GetPosition(null).Y - _mouseY;

                
double h = e.GetPosition(null).X - _mouseX;


                
// 移动后的 rectangle 对象相对于 Canvas 的坐标

                double newTop = v + (double)rectangle.GetValue(Canvas.TopProperty);

                
double newLeft = h + (double)rectangle.GetValue(Canvas.LeftProperty);


                
// 设置 rectangle 对象的位置为新的坐标.

                rectangle.SetValue(Canvas.TopProperty, newTop);

                rectangle.SetValue(Canvas.LeftProperty, newLeft);


                
// 更新鼠标的当前坐标

                _mouseY = e.GetPosition(null).Y;

                _mouseX 
= e.GetPosition(null).X;

            }

        }


        
private void rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

        
@H_834_1404@{

            
// ReleaseMouseCapture() - 如果指定的元素具有鼠标捕获,则释放该捕获

            rectangle.ReleaseMouseCapture();

            _isMouseCaptured 
= false;

        }

    }

}

@H_404_44@



2、Keyboard.xaml

@H_404_44@

<!--

@H_404_44@

KeyDown - 鼠标按下时触发的事件

@H_404_44@

KeyUp - 鼠标按下并放开时触发的事件

@H_404_44@

-->

@H_404_44@

<!--

@H_404_44@

KeyDown和KeyUp均为向上冒泡的路由事件,本例的事件路由为:TextBox -> Canvas -> UserControl

@H_404_44@

-->

@H_404_44@

< UserControl  x:Class ="Silverlight20.Interactive.Keyboard"

@H_404_44@

    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  

@H_404_44@

    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"  

@H_404_44@

    x:Name
="userControl"

@H_404_44@

    KeyDown
="userControl_KeyDown" >

@H_404_44@

    

@H_404_44@

    
< Canvas >

@H_404_44@

            

@H_404_44@

        
< TextBox  x:Name ="textBox"  Text ="TextBox"   />

@H_404_44@

        

@H_404_44@

    
</ Canvas >

@H_404_44@

    

@H_404_44@

</ UserControl >

@H_404_44@


Keyboard.xaml.cs

@H_404_44@

using  System;

@H_404_44@

using  System.Collections.Generic;

@H_404_44@

using  System.Linq;

@H_404_44@

using  System.Net;

@H_404_44@

using  System.Windows;

@H_404_44@

using  System.Windows.Controls;

@H_404_44@

using  System.Windows.Documents;

@H_404_44@

using  System.Windows.Input;

@H_404_44@

using  System.Windows.Media;

@H_404_44@

using  System.Windows.Media.Animation;

@H_404_44@

using  System.Windows.Shapes;

@H_404_44@


@H_404_44@

namespace  Silverlight20.Interactive

{

    
public partial class Keyboard : UserControl

    
{

        
public Keyboard()

        
{

            InitializeComponent();


            
this.Loaded += new RoutedEventHandler(Keyboard_Loaded);


            
// 为 UserControl 注册 KeyUp 事件

            userControl.KeyUp += new KeyEventHandler(userControl_KeyUp);

        }


        
void Keyboard_Loaded(object sender, RoutedEventArgs e)

        
{

            
// 让 UserControl 获得焦点,这样该 UserControl 内的元素才能监听到键盘事件

            userControl.Focus();

        }


        
private void userControl_KeyDown(object sender, KeyEventArgs e)

        
{

            
// 获取 textBox 对象的相对于 Canvas 的 x坐标 和 y坐标

            double x = (double)textBox.GetValue(Canvas.LeftProperty);

            
double y = (double)textBox.GetValue(Canvas.TopProperty);


            
// KeyEventArgs.Key - 与事件相关的键盘的按键 [System.Windows.Input.Key枚举]

            switch (e.Key)

            
{

                
// 按 Up 键后 textBox 对象向 上 移动 1 个像素

                
// Up 键所对应的 e.PlatformKeyCode == 38 

                
// 当获得的 e.Key == Key.UnkNown 时,可以使用 e.PlatformKeyCode 来确定用户所按的键

                case Key.Up:

                    textBox.SetValue(Canvas.TopProperty, y 
- 1);

                    
break;


                
// 按 Down 键后 textBox 对象向 下 移动 1 个像素

                
// Down 键所对应的 e.PlatformKeyCode == 40

                case Key.Down:

                    textBox.SetValue(Canvas.TopProperty, y 
+ 1);

                    
break;


                
// 按 Left 键后 textBox 对象向 左 移动 1 个像素

                
// Left 键所对应的 e.PlatformKeyCode == 37

                case Key.Left:

                    textBox.SetValue(Canvas.LeftProperty, x 
- 1);

                    
break;


                
// 按 Right 键后 textBox 对象向 右 移动 1 个像素

                
// Right 键所对应的 e.PlatformKeyCode == 39 

                case Key.Right:

                    textBox.SetValue(Canvas.LeftProperty, x 
+ 1);

                    
break;


                
default:

                    
break;

            }


            
// 同上:Key.W - 向上移动; Key.S - 向下移动; Key.A - 向左移动; Key.D - 向右移动

            switch (e.Key)

            
{

                
// KeyEventArgs.Handled - 是否处理过此事件


                
// 如果在文本框内敲 W ,那么文本框会向上移动,而且文本框内也会被输入 W

                
// 如果只想移动文本框,而不输入 W ,那么可以设置 KeyEventArgs.Handled = true 告知此事件已经被处理完毕

                case Key.W:

                    textBox.SetValue(Canvas.TopProperty, y 
- 1);

                    e.Handled 
= true;

                    
break;

                
case Key.S:

                    textBox.SetValue(Canvas.TopProperty, y 
+ 1);

                    e.Handled 
= true;

                    
break;

                
case Key.A:

                    textBox.SetValue(Canvas.LeftProperty, x 
- 1);

                    e.Handled 
= true;

                    
break;

                
case Key.D:

                    textBox.SetValue(Canvas.LeftProperty, x 
+ 1);

                    e.Handled 
= true;

                    
break;

                
default:

                    
break;

            }

        }


        
private void userControl_KeyUp(object sender, KeyEventArgs e)

        
{

            
/*

            System.Windows.Input.Keyboard.Modifiers - 当前按下的辅助键 [System.Windows.Input.ModifierKeys枚举]

                ModifierKeys.None - 无

                ModifierKeys.Alt - Alt 键

                ModifierKeys.Control - Ctrl 键

                ModifierKeys.Shift - Shift 键

                ModifierKeys.Windows - Windows 键

                ModifierKeys.Apple - Apple 键(苹果电脑)

            
*/


            
// 按 Ctrl + M 则将 textBox 的位置设置为其初始位置

            if (System.Windows.Input.Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.M)

            
{

                textBox.SetValue(Canvas.LeftProperty, 0d);

                textBox.SetValue(Canvas.TopProperty, 0d);

            }

        }

    }

}

@H_404_44@



OK
[源码下载]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐