Wpf 如何确保MouseEnter为所有元素激发

Wpf 如何确保MouseEnter为所有元素激发,wpf,mvvm-light,Wpf,Mvvm Light,我有一个WPF Items控件,显示一系列矩形 每个矩形都使用MVVM Lights EventToCommand跟踪鼠标事件,并将矩形设置为“选定” 然后,我使用该属性在样式中使用触发器高亮显示矩形 如果鼠标拖得太快,就会出现问题 工作(缓慢拖动): 不工作(快速拖动): 在这种情况下,没有为第二个矩形触发事件 如何确保鼠标移动到的所有控件都触发事件?我的建议是将所有发生的事件放入队列中。我认为您的问题是因为当一个事件触发时,您调用一个方法,如果该方法在下一个事件发生时尚未完成,则无法再次

我有一个WPF Items控件,显示一系列矩形

每个矩形都使用MVVM Lights EventToCommand跟踪鼠标事件,并将矩形设置为“选定”

然后,我使用该属性在样式中使用触发器高亮显示矩形

如果鼠标拖得太快,就会出现问题

工作(缓慢拖动):

不工作(快速拖动):

在这种情况下,没有为第二个矩形触发事件


如何确保鼠标移动到的所有控件都触发事件?

我的建议是将所有发生的事件放入队列中。我认为您的问题是因为当一个事件触发时,您调用一个方法,如果该方法在下一个事件发生时尚未完成,则无法再次调用该方法。 创建一个队列并将发生的事件放在其中,然后创建一个等待队列填充的线程,然后对其进行处理

样本:

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
  using System.Timers;

  using Timer = System.Timers.Timer;

  class Program
  {
    private static Queue<My_Event> EventQueue;
    private static Timer t = new Timer(10);

       static void Main(string[] args)
       {
         Task thread = new Task(MarkStuffYellow);

         EventQueue = new Queue<My_Event>();
         t.Elapsed += t_Elapsed;
         t.Start();
         t.AutoReset = true;
       }

       static void t_Elapsed(object sender, ElapsedEventArgs e)
       {
         EventQueue.Enqueue(new My_Event(sender, e));
       }

       private static void MarkStuffYellow()
       {
         /// !!! While (true) is not an solution, if you do it like this,
         /// your CPU will be full !!!
         while (true)
         {
           if (EventQueue.Any())
           {
             My_Event myEvent = EventQueue.Dequeue();
             var sender = myEvent.Sender;
             var e = myEvent.E;
             /// Do Stuff with your event
           }
         }
       }
     }

     /// Needed to save your event
     internal class My_Event
     {

       public My_Event(object sender, ElapsedEventArgs e)
       {
         this.Sender = sender;
         this.E = e;
       }

       public object Sender;

       public ElapsedEventArgs E;
     }
   }
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
命名空间控制台应用程序3
{
使用系统计时器;
使用定时器=System.Timers.Timer;
班级计划
{
私有静态队列事件队列;
专用静态定时器t=新定时器(10);
静态void Main(字符串[]参数)
{
任务线程=新任务(标记为黄色);
EventQueue=新队列();
t、 已用时间+=t_已用时间;
t、 Start();
t、 自动重置=真;
}
静态无效时间(对象发送器,ElapsedEventArgs e)
{
排队(新的My_事件(发送方,e));
}
私有静态void MarkStuffYellow()
{
///!!!虽然(true)不是解决方案,但如果您这样做,
///您的CPU将满!!!
while(true)
{
if(EventQueue.Any())
{
My_Event myEvent=EventQueue.Dequeue();
var sender=myEvent.sender;
var e=myEvent.e;
///为你的活动做些事情
}
}
}
}
///需要保存您的事件
内部类My_事件
{
公共My_事件(对象发送方,ElapsedEventArgs e)
{
this.Sender=Sender;
这个。E=E;
}
公共对象发送器;
公共ElapsedEventArgs E;
}
}