wpf自定义控件(WPF-7.鼠标输入事件)
wpf自定义控件(WPF-7.鼠标输入事件)
2024-11-22 05:13:01  作者:半生轻浮  网址:https://m.xinb2b.cn/know/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);


  • 小米对讲机3代会出吗(小米对讲机3发布)
  • 2024-11-22小米对讲机3发布4月5日消息,今天小米推出了第三代对讲机,将于今晚20点正式开售,到手价399元新品支持4G全网通,依托三大运营商4G网络,可实现全国5000公里的对讲距离,突破传统对讲机通话距离限制,而且赠送2年免。
  • 切非是什么意思(切非的意思)
  • 2024-11-22切非的意思切非是一种控制模块,一般设在配电箱内,用于消防状态下切断非消防用电源一旦火灾发生时,消防主机联动相关区域的控制模块,切断照明配电、非消防动力配电等肯定不会设在消防配电箱,消防电源是不能切断的非消防用电。
  • 维密秀穿旗袍(维密成了红高粱模特队)
  • 2024-11-22维密成了红高粱模特队有一种中国风,叫歪果仁眼中的中国风by唱跳女子组合印象中的维多利亚的秘密大秀一般是这样的这样的或者是这样的跟往常一样,唱跳本着围观美好肉体、激励自己健康生活的良好心态,欣赏了今年的维密秀今年的维密秀在。
  • 买狗时如何分辨哈士奇和二哈(养狗一年才知道)
  • 2024-11-22养狗一年才知道哈士奇,一般是指西伯利亚雪橇犬,是一种古老的犬种,它的名字源自其独特的嘶哑叫声,现在很多人都喜欢哈士奇这种神奇的犬种二哈,是哈士奇的绰号,很多人都说这不是一样的吗?它们可能是同类,但是却有差别,养狗一。
  • 圣诞节必看的13部电影(盘点圣诞节好看电影)
  • 2024-11-22盘点圣诞节好看电影摘要:这个世界呢,那么现实,只有看电影才能在美梦与噩梦里越走越远圣诞节快到了,来瞅瞅有什么好看的电影呢?《圣诞狗狗》故事讲诉五位黄金猎犬小狗狗的冒险事迹(Budderball、Mudbud、Roseb。
  • 黄瓜炒瘦肉怎么做(做黄瓜炒瘦肉的技巧)
  • 2024-11-22做黄瓜炒瘦肉的技巧里脊3两、黄瓜1根、鸡粉(3克)少许、淀粉(5克)1茶匙、盐少许、姜末5克、油(10克)2茶匙步骤:里脊肉洗净,切成3毫米左右厚的片将鸡粉、淀粉调入肉片中抓匀,腌制10分钟,能将肉片的水分更好地锁住,。
  • 天谕手游怎么点亮星之晶(天谕手游如何点亮星之晶)
  • 2024-11-22天谕手游如何点亮星之晶想要点亮神格星之晶,首先需要点击【菜单】功能接着选中【修为】功能后再点击【神格】功能之后再点击【神格】页面右下角的【图鉴】功能进入到【图鉴】页面后,接着再选中星之晶之后再点击【点亮】功能,这样消耗40。
  • 谢莉斯晚年丧女(谢莉斯的丈夫郎文曜)
  • 2024-11-22谢莉斯的丈夫郎文曜点击关注,每天都有名人故事感动您!郎文曜与谢莉斯中国煤矿文工团的著名导演、编剧郎文曜,是歌唱家谢莉斯的丈夫,两人于1973年在北京结婚,次年诞下女儿郎乐这对患难夫妻人生坎坷,经历了太多的磨难与心痛郎文。
  • 爆笑海绵宝宝电影(老少皆宜的3d电影海绵宝宝)
  • 2024-11-22老少皆宜的3d电影海绵宝宝影片开场是本片的大反派胡子海盗(安东尼.班德拉斯)来到神秘的小岛上,经过一帆凶险,得到了一本拥有魔法的书籍蟹老板的死对头痞老板为了夺取蟹黄堡的神秘配方向发动攻击,双方展开激烈战斗!虽然海绵宝宝成功挫败。
  • 菠菜和牛奶能一块吃吗(菠菜不能和豆腐牛奶一起吃)
  • 2024-11-22菠菜不能和豆腐牛奶一起吃大家好!我是福爸,执业医师,专注研究体重管理和疾病营养治疗二十余年希望我的文章对您有用在所有蔬菜当中,菠菜的传言最多了,从最早的菠菜补铁,到菠菜和豆腐牛奶相克菠菜表示好冤枉啊​关于菠菜食物相克的传言由。
  • 关于青岛奥帆中心的说明文
  • 2024-11-22关于青岛奥帆中心的说明文青岛奥林匹克帆船中心位于青岛市东部新区浮山湾畔,北海船厂原址,毗邻五四广场和东海路,市内的著名风景点“燕岛秋潮”位于基地内燕儿岛山的东南角,2008年第29届奥运会和13届残奥会帆船比赛就是在这里举行。