WPF响应长按事件

简介: 原文:WPF响应长按事件 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lwwl12/article/details/78983140 ...
原文: WPF响应长按事件

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lwwl12/article/details/78983140
思路:MouseDown 时启动一个线程并标记IsMouseDown=True,若MouseUp则修改标记IsMouseDown=False,线程内Sleep 1500ms之后判断IsMouseDown=True则开始响应事件
bool IsLeftMouseDown = false;  
private void DataGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)  
{  
    IsLeftMouseDown = true;  
    Thread th = new Thread(new ThreadStart(() =>  
    {  
        Thread.Sleep(1500);  
  
        if (IsLeftMouseDown)  
        {  
            MessageBox.Show("长按了1.5秒");  
            IsLeftMouseDown = false;  
        }  
        else  
        {  
            MessageBox.Show("1.5秒内释放了点击");  
        }  
    }));  
    th.Start();  
}  
  
private void DataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)  
{  
    IsLeftMouseDown = false;  
}  

以上的实现可以解决问题,但是有bug,以下提供更优的解决方案:

        bool IsLeftMouseDown = false;

        bool EntryTouch = false;

        Thread th = null;
        private void DataGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            IsLeftMouseDown = true;

            if (th != null)
            {
                if (th.ThreadState == ThreadState.Running || th.ThreadState == ThreadState.WaitSleepJoin)
                    th.Abort();
            }
            th = new Thread(new ThreadStart(() =>
            {
                Thread.Sleep(1500);

                if (IsLeftMouseDown)
                {
                    EntryTouch = true;

                    MessageBox.Show("长按了1.5秒");
                    IsLeftMouseDown = false;
                }
                else
                {
                    MessageBox.Show("1.5秒内释放了点击");
                }

                EntryTouch = false;

            }));
            th.Start();
        }

        private void DataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if(EntryTouch)
            {
                MessageBox.Show("已进入长按事件");
            }

            IsLeftMouseDown = false;
        }


目录
相关文章
|
6月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
143 0
|
前端开发 C# Windows
WPF鼠标、键盘、拖拽事件、用行为封装事件
本文主要介绍了WPF中常用的鼠标事件、键盘事件以及注意事项,同时使用一个案例讲解了拓展事件。除此之外,本文还讲述如何用行为(Behavior)来封装事件。
400 0
|
Java C# 程序员
WPF程序中的弱事件模式
原文:WPF程序中的弱事件模式 在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不是按照我们所期望的方式工作。 例如,我想实现一个在窗口的标题栏中实时显示当前的时间,一个比较常规的做法如下:     var...
1177 0
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
如何解决WPF中 ScrollViewer 内包含 TreeView 或者 ListBox 等控件时滚轮事件被劫持的问题
|
C#
WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果
原文:WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果   本以为Label也有TextChanged 事件,但在使用的时候却没找到,网友说Label的Content属性改变肯定是使用赋值操作,赋值的时候就可以对其进行相应的操作所以不需TextChanged 事件。
2101 0
|
C# Windows 对象存储
WPF 路由事件 Event Routing
原文:WPF 路由事件 Event Routing 1.路由事件介绍 之前介绍了WPF的新的依赖属性系统,本篇将介绍更高级的路由事件,替换了之前的.net普通事件。
1319 0
|
C# 数据可视化 容器
WPF触屏Touch事件在嵌套控件中的响应问题
原文:WPF触屏Touch事件在嵌套控件中的响应问题 前几天遇到个touch事件的坑,记录下来以增强理解。 具体是 想把一个listview嵌套到另一个listview,这时候如果list view(子listview)的内容过多超过容器高度,它是不会出现滚动条压缩内容区域的,反而会将滚动区域转移到外面的list view(父listview),这个无可争议,但这个问题开始没留意,为待会的坑埋下伏笔。
1052 0
|
C# 前端开发
WPF当属性值改变时利用PropertyChanged事件来加载动画
原文:WPF当属性值改变时利用PropertyChanged事件来加载动画     在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通过写代码的这种方式来加载动画,在我们的这篇博客中我们尽量使用简洁的语言来阐述这一方法。
1534 0
|
.NET C# 开发框架
WPF - 善用路由事件
原文:WPF - 善用路由事件   在原来的公司中,编写自定义控件是常常遇到的任务。但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件。那我们应该怎样宰自定义控件开发中使用路由事件?我们将在这篇短文中对该问题进行讨论。
933 0
|
C# 容器
WPF中的多点触摸事件
原文:WPF中的多点触摸事件 UIElement在WPF4下添加了很多支持多点触摸的事件,通过它们可以在硬件支持的情况下处理多点触摸,以下通过代码来说明通过处理这些事件,我们可以做些什么: 一.触摸相关的多种事件,跟鼠标事件是对应的,通过这些事件可以获取到多个触摸的鼠标点,并进行相应的处理 ...
890 0