WPF响应长按事件

思路: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;
        }


WPF Prism 是一个用于构建松耦合、可测试和可维护的WPF应用程序的框架。在Prism框架中,事件响应跳转页面通常涉及到模块化开发和使用MVVM模式。Prism提供了一套导航服务,允许开发者在模块间进行页面跳转。以下是通过Prism的事件响应来跳转页面的基本步骤: 1. 定义一个事件:首先,你需要定义一个事件来触发页面跳转。这可以通过创建一个`EventAggregator`来发布和订阅事件。 2. 发布事件:在某个特定的条件或者操作发生时,你可以通过`EventAggregator`发布一个事件。例如,在一个按钮点击事件中发布。 3. 订阅事件:在需要进行页面跳转的视图模型中,你需要订阅之前定义的事件。当事件被发布时,订阅了该事件的视图模型可以响应,并触发页面跳转。 4. 使用NavigationService进行页面跳转:Prism提供了`NavigationService`来处理页面之间的导航。在订阅事件的方法中,你可以使用`NavigationService`来导航到新的页面。 以下是一个简单的代码示例: ```csharp // 在事件发布方 public void OnEventButtonClicked() { _eventAggregator.GetEvent<EventName>().Publish(); } // 在事件订阅方的ViewModel中 public ViewModel(EventAggregator eventAggregator) { _eventAggregator = eventAggregator; _eventAggregator.GetEvent<EventName>().Subscribe(OnEventReceived); } private void OnEventReceived() { // 当事件被触发时,执行页面跳转 _navigationService.Navigate("NewPage"); } ``` 在上述代码中,`EventName`是定义的事件名称,`NewPage`是目标页面的名称。`EventAggregator`用于发布和订阅事件,而`NavigationService`用于执行实际的页面跳转。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值