精通Silverlight——12.2.1 鼠标事件

本文介绍如何在WPF中使用鼠标事件控制图形动画。通过处理MouseEnter和MouseLeftButtonDown等事件,实现图形动画的播放与停止,以及图形位置的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    派生自UIElement的对象大都具有如下五个鼠标事件,每种事件都具有一个object和一个MouseEventArgs类型的参数。object类型的sender参数表示触发鼠标事件的对象,MouseEventArgs类型的参数在不同的事件中则有不同的参数值。

q      MouseMove事件:当鼠标位置改变时触发,MouseEventArgs参数包含输入信息。

q      MouseEnter事件:当鼠标进入指定对象的区域时,MouseEventArgs参数包含输入信息。

q      MouseLeave事件:当鼠标离开指定对象的区域时,MouseEventArgs参数为null值。

q      MouseLeftButtonDown事件:当鼠标左键按下时,MouseEventArgs参数包含输入信息。

q      MouseLeftButtonUp事件:当鼠标左键释放时,MouseEventArgs参数包含输入信息。

下面举一个使用鼠标事件的示例程序,该程序的运行效果如图所示。

 

该示例在画布上绘制了两个圆,对大一点的圆处理了MouseEnterMouseLeftButtonDown事件,对小圆则仅处理了MouseLeftButtonDown事件。

当鼠标移动到大圆上时,动画开始,大圆似乎在不停的滚动,而小圆则像皮球一样不停的弹跳。当在大圆上单击鼠标左键,动画停止。此时可以在小、圆上单击左键,则小圆的位置会被改变。

该示例的XAML代码如下所示:

<Canvas

        xmlns="http://schemas.microsoft.com/client/2007"

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

        x:Name="parentCanvas"

        Loaded="Page_Loaded"

        x:Class="MouseEventDemo1.Page;assembly=ClientBin/MouseEventDemo1.dll"

        Width="640"

        Height="480"

        Background="White"

        >

  <!--在这里定义了关键帧动画-->

         <Canvas.Resources>

                   <Storyboard x:Name="Bigball">

                            <PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BigBall" Storyboard.TargetProperty="(Shape.Fill).(RadialGradientBrush.GradientOrigin)" RepeatBehavior="Forever">

                                               <SplinePointKeyFrame KeyTime="00:00:00" Value="0.257,0.426"/>

                                               <SplinePointKeyFrame KeyTime="00:00:00.1000000" Value="0.46,0.193"/>

                                               <SplinePointKeyFrame KeyTime="00:00:00.2000000" Value="0.748,0.48"/>

                                               <SplinePointKeyFrame KeyTime="00:00:00.4000000" Value="0.47,0.772"/>

                                               <SplinePointKeyFrame KeyTime="00:00:00.5000000" Value="0.134,0.569"/>

                                               <SplinePointKeyFrame KeyTime="00:00:00.6000000" Value="0.257,0.426"/>

                                     </PointAnimationUsingKeyFrames>

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SmallBall" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" RepeatBehavior="Forever">

                                               <SplineDoubleKeyFrame KeyTime="00:00:00" Value="-100.5"/>

                                               <SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="85.5"/>

                                     </DoubleAnimationUsingKeyFrames>

                            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="SmallBall" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">

                                     <SplineDoubleKeyFrame KeyTime="00:00:00" Value="-41"/>

                                     <SplineDoubleKeyFrame KeyTime="00:00:00.6000000" Value="-8.5"/>

                            </DoubleAnimationUsingKeyFrames>

                   </Storyboard>

         </Canvas.Resources>

   <!--定义一个大圆,使用放射渐变填充,-->

         <Ellipse Width="101" Height="101" Stroke="#FF000000" Canvas.Left="183" Canvas.Top="179" x:Name="BigBall">

                   <Ellipse.Fill>

                            <RadialGradientBrush GradientOrigin="0.257,0.426">

                                     <GradientStop Color="#FFD22C2C" Offset="1"/>

                                      <GradientStop Color="#FFFFFFFF" Offset="0"/>

                            </RadialGradientBrush>

                   </Ellipse.Fill>

         </Ellipse>

  <!--定义一个小圆,使用放射渐变填充,并为小圆定义了变换,以便于动画调用-->

         <Ellipse Width="47" Height="47" Stroke="#FF000000" Canvas.Left="311" Canvas.Top="247" x:Name="SmallBall" RenderTransformOrigin="0.5,0.5">

                   <Ellipse.Fill>

                            <RadialGradientBrush GradientOrigin="0.245,0.436">

                                     <GradientStop Color="#FF2A8063" Offset="1"/>

                                     <GradientStop Color="#FFFFFFFF" Offset="0"/>

                            </RadialGradientBrush>

                   </Ellipse.Fill>

                   <Ellipse.RenderTransform>

                            <TransformGroup>

                                     <ScaleTransform ScaleX="1" ScaleY="1"/>

                                     <SkewTransform AngleX="0" AngleY="0"/>

                                     <RotateTransform Angle="0"/>

                                     <TranslateTransform X="0" Y="0"/>

                            </TransformGroup>

                   </Ellipse.RenderTransform>

         </Ellipse>

</Canvas>

XAML代码中,为大圆的x:Name指定了BigBall名称,小圆的是SmallBall,而故事板则为Bigball。有了这些名称,则可以编程直接进行访问,C#代码如下所示。

namespace MouseEventDemo1

{

    public partial class Page : Canvas

    {

        public void Page_Loaded(object o, EventArgs e)

        {

            // Required to initialize variables

            InitializeComponent();

            //订阅事件

            BigBall.MouseEnter += new MouseEventHandler(BigBall_MouseEnter);

            BigBall.MouseLeftButtonDown += new MouseEventHandler(BigBall_MouseLeftButtonDown);

            SmallBall.MouseLeftButtonDown += new MouseEventHandler(SmallBall_MouseLeftButtonDown);

        }

        //改变小圆的位置

        void SmallBall_MouseLeftButtonDown(object sender, MouseEventArgs e)

        {

            SmallBall.SetValue(Canvas.LeftProperty, BigBall.GetValue(Canvas.LeftProperty));

            SmallBall.SetValue(Canvas.TopProperty, BigBall.GetValue(Canvas.TopProperty));

        }

        //停止播放动画

        void BigBall_MouseLeftButtonDown(object sender, MouseEventArgs e)

        {

            Bigball.Stop();

        }

        //开始播放动画

        void BigBall_MouseEnter(object sender, MouseEventArgs e)

        {

            Bigball.Begin();

        }

    }

}

很简单,利用UIElement的鼠标事件,分别用于控制动画和设置图形对象的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值