wpf自定义控件(WPF-7.鼠标输入事件)
wpf自定义控件(WPF-7.鼠标输入事件)
2024-11-25 12:43:51  作者:半生轻浮  网址:https://m.xinb2b.cn/sport/glj453774.html

摘要

鼠标输入也是一种常见的WPF事件类型,主要通过鼠标的操作来触发事件。 常见的鼠标事件有MouseEnter和MouseLeave,分别是在鼠标移动到组件上和离开组件时触发的,这两个事件都是直接事件,尽在某个元素上触发,不会传播到别的元素上。 除了这两种比较简单的直接时间,也包括一些冒泡路由事件和隧道路由事件,比如:PreviewMouseMove、MouseMove等

正文

鼠标单击

鼠标单击 鼠标单击分为鼠标左键和鼠标右键的单击,常见的鼠标单击事件会触发以下事件: PreviewMouseLeftButtonDown

PreviewMouseRightButtonDown

MouseLeftButtonDown

MouseRightButtonDown

PreviewMouseLeftButtonUp

PreviewMouseRightButtonUp

MouseLeftButtonUp

MouseRightButtonUp

Preview 一般是隧道

捕获鼠标

如果我们希望只能某个组件独占鼠标,那么我们利用鼠标捕获,让该组件捕获鼠标,从而鼠标点击其他组件时无法进入到响应函数中。

<Window x:Class="_7.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:_7" mc:Ignorable="d" Title="MainWindow" Height="350" Width="600" MouseDown="Window_MouseDown" MouseMove="Window_MouseMove" > <StackPanel> <Button x:Name="btnCapture" Content="捕获" Click="btnCapture_Click" Margin="20"></Button> <Label Name="lblPostion" Margin="20" Background="AntiqueWhite"></Label> <Rectangle Stroke="Aqua" Width="100" Height="100" Margin="20" x:Name="rect"> </Rectangle> </StackPanel></Window>

private void Window_MouseDown(object sender, MouseButtonEventArgs e){ lblPostion.Content = e.GetPosition(rect);}private void Window_MouseMove(object sender, MouseEventArgs e){ lblPostion.Content = e.GetPosition(rect);}private void btnCapture_Click(object sender, RoutedEventArgs e){ Mouse.Capture(this.rect);}

拖拽

鼠标拖放就是将窗口内某个元素拖离原来位置并放置到窗口的其他位置上,一般拖放分为三个步骤:

鼠标单击选择要拖放的元素;鼠标左键按住不放移动元素使其位置发生变化;鼠标松开左键将元素放置在某个位置。 AllowDrop="True"

<Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <Label Content="Hello world" Name="lbl1" Grid.Row="0" AllowDrop="True" BorderThickness="1" BorderBrush="Blue" MouseDown="lbl1_MouseDown"></Label> <Label Content="" Name="lbl2" Grid.Row="1" Foreground="Red" BorderThickness="1" BorderBrush="Red" Drop="lbl2_Drop" AllowDrop="True"></Label></Grid>

private void lbl1_MouseDown(object sender, MouseButtonEventArgs e){ Label lbl=(Label)sender; DragDrop.DoDragDrop(lbl,lbl.Content,DragDropEffects.Copy);}private void lbl2_Drop(object sender, DragEventArgs e){ lbl2.Content = e.Data.GetData(DataFormats.Text);}

做一个拖拽的例子

MouseMove

MouseLeftButtonUp

MouseLeftButtonDown

当Down,捕获鼠标

当Up,释放鼠标

当Move,修改Top,Left,

.SetValue(Canvas.LeftProperty, point.X - mouseOffset.X);

.SetValue(Canvas.TopProperty, point.Y - mouseOffset.Y);

<Canvas x:Name="cav"> <Rectangle x:Name="rect1" Fill="LightCoral" Width="100" Height="100"></Rectangle> <Rectangle x:Name="rect2" Fill="LightBlue" Width="100" Height="100" Canvas.Right="0" Canvas.Top="0" ></Rectangle> <Rectangle x:Name="rect3" Fill="LightGray" Width="100" Height="100" Canvas.Right="0" Canvas.Bottom="0"></Rectangle> <Rectangle x:Name="rect4" Fill="LightGreen" Width="100" Height="100" Canvas.Left="0" Canvas.Bottom="0"></Rectangle> <Label Content="AAA" ></Label></Canvas>

写一个简单拖拽类

internal class DragClass{ bool isDrag = false; Point mouseOffset; public Canvas cav { get; set; } public System.Windows.UIElement ui { get; set; } public DragClass(Canvas cav, System.Windows.UIElement ui) { this.cav = cav; this.ui = ui; this.ui.MouseLeftButtonDown = Ui_MouseLeftButtonDown; this.ui.MouseLeftButtonUp = Ui_MouseLeftButtonUp; this.ui.MouseMove = Ui_MouseMove; } private void Ui_MouseMove(object sender, MouseEventArgs e) { if (isDrag) { Point point = e.GetPosition(this.cav); ((System.Windows.UIElement)sender).SetValue(Canvas.TopProperty, point.Y - mouseOffset.Y); ((System.Windows.UIElement)sender).SetValue(Canvas.LeftProperty, point.X - mouseOffset.X); } } private void Ui_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (isDrag) { ((System.Windows.UIElement)sender).ReleaseMouseCapture(); isDrag = false; } } private void Ui_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { isDrag = true; mouseOffset = e.GetPosition((System.Windows.IInputElement)sender); ((System.Windows.UIElement)sender).CaptureMouse(); }}

DragClass drap1 = new DragClass(this.cav, this.rect1);DragClass drap2 = new DragClass(this.cav, this.rect2);DragClass drap3 = new DragClass(this.cav, this.rect3);DragClass drap4 = new DragClass(this.cav, this.rect4);


  • 哆啦a梦大雄的月球历险记(大雄的月球探险记)
  • 2024-11-25大雄的月球探险记最初看这部电影的时候,偶然间看了一下这部电影的海报,上面写着献给孩子六一儿童节的礼物无意中想了一下,自己已经不再是孩子了,但是为什么又重新出现在《哆啦A梦:大雄的月球探险记》的观众席上呢?最开始认为,。
  • 汪直人品(视野与国运汪直的再思考)
  • 2024-11-25视野与国运汪直的再思考他是一个精明的徽商,他经营的丝绸深受西方宫廷追捧;他控制倭寇,称雄东亚海域,也是唯一一位在日本列岛上建立商业殖民地的中国人;他被诱捕杀害,之后明朝开始了长达6年的艰难抗倭之战;他为实现东亚贸易“互市”。
  • 爱的勇气和力量分享(爱的温暖和力量)
  • 2024-11-25爱的温暖和力量图片来源:影像中国岂曰无衣,与子同袍长江浩荡,暮霭沉沉夜色一点一点漫了过来,笼罩在武汉上空月亮仿佛也戴上了口罩,只露出小半张脸,注视着这里的街市四处霓虹闪烁,却鲜有人语——入夜的武汉,本是一座人声鼎沸。
  • 为什么冰的热扩散比水快(比热为何会随温度呈现阶梯变化)
  • 2024-11-25比热为何会随温度呈现阶梯变化双原子分子的能谱为何有红移和蓝移?比热为何会随温度呈现阶梯变化?日前,《张朝阳的物理课》线下第六课开讲,搜狐创始人、董事局主席兼CEO张朝阳分析了氢原子的各个能量阶梯,并对双原子分子气体比热做了计算和。
  • 官方账号正式开通,刚刚公告即将开通
  • 2024-11-25官方账号正式开通,刚刚公告即将开通今天相山区疾病预防控制中心发布相山区人乳头瘤病毒(HPV)九价疫苗线上预约接种(试行)公告▽广大居民朋友:为有效缓解全区女性居民接种HPV疫苗难的现状,拟在相山区开展首批人乳头瘤病毒(HPV)疫苗线上。
  • 苹果手机系统卡死怎么办(苹果手机系统卡顿)
  • 2024-11-25苹果手机系统卡顿2022✦现在手机是几乎人手一个,已经融入大家的生活中,给大家生活也带来了很多便利,我们每天都在使用,使用过程中多多少少都有遇到系统卡顿、死机的问题如果在使用过程当中出现运行缓慢或卡死、死机的情况,以。
  • 配音文字转语音(原来这样可以文本转语音)
  • 2024-11-25原来这样可以文本转语音随着短视频的日益全民化,视频制作几乎成为了必备技能;还记得之前洗脑的神曲”冰墩墩“,自此AI配音开始走入大众视野,只要简单输入文字就能智能生成语音;那有什么好用的文字转语音的工具呢?今天就来推荐一款—。
  • 孕期多吃三种食物对胎儿有影响(孕期吃哪些食物对胎儿有好处)
  • 2024-11-25孕期吃哪些食物对胎儿有好处一旦怀孕后,孕妇在很多事情上需要特别注意,除了不能像往常一样到处跑动,不能做剧烈运动外,还有最重要的是孕妇的饮食孕妇在饮食上要特别注意,不当的饮食会危及孕妇和胎儿的健康那么,在怀孕期间补充什么营养素,。
  • 巴啦啦小魔仙美雪现状(巴啦啦小魔仙演员现今发展)
  • 2024-11-25巴啦啦小魔仙演员现今发展电视剧《巴啦啦小魔仙》可谓是成了不少孩子暑假必看的电视剧,如今剧里的人物在现实生活中也是发展的不同小月扮演者周娇,如今34岁,但颜值依旧在线,不显老严莉莉扮演者刘美含,是曾经的超级女声,不过人家依旧长。
  • 大人物电影中客串(大人物中明星太多)
  • 2024-11-25大人物中明星太多在近日,想必大家都被《大人物》这部电影折服了,不少的网友也是通过这部电影明白一个道理,那就是“带毛的包贝尔”,并且这部电影中的演技也是很好的,不过许多的观众在看完电影以后,却是忽略了那些客串的演员,而。
  • 陈自瑶tvb颁奖红毯(TVB女星红毯生图陈自瑶秀美腿)
  • 2024-11-25TVB女星红毯生图陈自瑶秀美腿饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!11月11日,有媒体晒出了TVB所举行《周年庆典节目巡礼2023》活动的照片,有将近150名明星出席该活动,现场画面可谓十分壮观据悉,出席该。