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


  • 蚩尤坐骑大熊猫(蚩尤坐骑上古神兽)
  • 2024-11-05蚩尤坐骑上古神兽众所周知,大熊猫是中国的国宝,而本人也是四川的,老是有小伙伴问我:你们四川人是不是天天吃火锅,家家养大熊猫当宠物?当然这是笑话了那么在古代,大熊猫是什么神兽,吃了会犯罪吗?大熊猫在古代历史中存在感强不。
  • 吉利帝豪1.5l发动机优点(吉利帝豪外观漂亮)
  • 2024-11-05吉利帝豪外观漂亮汽车走进生活,选最适合自己的车哈喽,大家好,我是红涛说车说到国产品牌轿车,吉利帝豪是很有代表性的选手,从第1代产品到现在的第4代帝豪,取得了非常好的销量成绩,也为吉利汽车的发展起到了关键性的作用!最近。
  • 保险经纪人和独立代理人的区别(傻傻分不清楚的保险代理人)
  • 2024-11-05傻傻分不清楚的保险代理人各行各业都有自己的专业名称,同时也会在实际生活中衍生出很多的口语称呼,像是保险领域:普通人称:卖保险的、销售保险的业内称:代理人、经纪人其他还有:营销员、销售员等等使得初次接触的伙伴一头雾水,有差别吗。
  • 柳永离别难的全诗(多情自古伤离别)
  • 2024-11-05多情自古伤离别推荐:王熙凤哪里来的资本,敢公开与王夫人作对?文/段云飞【作者简介】段云飞,女,淮南市作家协会会员,出生于1994年8月爱好写作自2004年以来在《淮南日报》《少年之友报》《农村孩子报》《淮河早报》等。
  • 烤箱烤法式小羊排做法 这道香煎小羊排太销魂
  • 2024-11-05烤箱烤法式小羊排做法 这道香煎小羊排太销魂羊排泡出血水洗净羊排切块放入电压力锅,放姜片,葱段,桂皮,孜然粒,料酒,花椒,八角,香叶,用闷炖排骨功能将羊排闷烂闷好后捞出羊排控净水,切姜片,洋葱切块,胡萝卜滚刀切薄块备用锅中放平时炒菜两倍的油,放。
  • 我变成了一只猫变形记作文(我变成了一只猫变形记的范文)
  • 2024-11-05我变成了一只猫变形记的范文看着家里的猫,整天吃了睡,睡了吃,吃了玩,那是非常快乐我呢,每天要上学,每天做作业,要是变成猫就好了放学后,我懒洋洋地躺在沙发上猫看见了,跑到沙发上来,用它那亮闪闪的眼睛盯着我,一阵白光飞了出来;我也。
  • 谁极限生存被饿死(饿了吃鲨鱼渴了喝雨水)
  • 2024-11-05饿了吃鲨鱼渴了喝雨水这三个人已经在太平洋上漂流了5天,没有淡水的他们祈祷上帝给他们下一场雨晚上真的如愿了,漂流8天后没有食物的他们,打算用手里的小刀进行捕鱼接下来真的抓到一条鲨鱼是运气爆棚还是死亡前的回光返照?一部真实事。
  • 商务礼仪包括仪容仪表两个方面(商务礼仪培训之)
  • 2024-11-05商务礼仪培训之商务礼仪培训之:什么是仪容仪表PPT内容简介:一、仪容仪表篇(一)仪容仪容,通常指人的外观、外貌就个人的整体形象而言,容貌是整个仪表的一个至关重要的环节它反映着一个人的精神面貌、朝气和活力,是传达给接。
  • 年华似水的意思(年华似水的出处)
  • 2024-11-05年华似水的出处年华似水的意思:人的青春岁月,很快就随着时光溜走了指时间匆匆,岁月滚滚美好的时光像水一样地流走,恍惚间已无法追寻,只流下无尽的怆然;人生犹如流水一般,看起来数十年光阴哗哗的流逝掉了,而且一去不复返,形。
  • amiro美容仪适用的年龄 国货之光AMIRO以光学黑科技
  • 2024-11-05amiro美容仪适用的年龄 国货之光AMIRO以光学黑科技近年来,新时代的中国女性经济地位大幅度提升,迅速成为消费市场中一股不容忽视的力量知名智能美容个护品牌AMIRO,以中国技术为骄傲,凭借国内最顶尖的硬核光电科技研发实力,率先打入年轻女性的市场一系列“光。
  • 谈一谈冰墩墩走红的原因(妈妈我也想要冰墩墩)
  • 2024-11-05妈妈我也想要冰墩墩钱江晚报·小时新闻记者杨静通讯员李文瑶这几天的“冰墩墩”秒空热潮你参与了吗?北京冬奥会官方旗舰店每天都会定点进行北京冬奥会吉祥物“冰墩墩”的预售,开售几秒钟就被抢空到下架的情况让不少喜欢冰墩墩、雪容融。
  • 城市里最适合养的五种狗(农村人最喜欢养的5种狗)
  • 2024-11-05农村人最喜欢养的5种狗城里人跟农村人在做某些事情的时候,会有很大的不同,比如说,在养狗这件事情上,两者的所作所为就有很大的不同城里人比较喜欢养长得好看的狗,比如说哈士奇、金毛、拉布拉多犬等,而农村人不同,农村人养狗,更注重。