如何捕捉鼠标点击事件以覆盖的ItemsControl

9 浏览
0 Comments

如何捕捉鼠标点击事件以覆盖的ItemsControl

我想使用WPF开发一种矢量图像编辑器。\n具有相同形状的每个形状都放置在一个ItemsControl中。\n至少有4种形状(线条、矩形、位图等)。\n问题是:\n我不能点击位于其他图层下面的形状。\n要求:\n

    \n

  1. ItemsControl的ItemsPanelTemplate必须是大小不为0的Canvas。
  2. \n

  3. 每个形状都可以随时点击,而不需要在可点击的形状上激活IsHitTestVisible。
  4. \n

\n问题:\n

我如何使上层ItemsControl下面的形状可点击?

\n编辑1:\n添加代码片段\n


    
    
        
            
                
            
        
        
            
        
        
            
        
    
    
    
        
            
                
            
        
        
            
        
        
            
        
    

0
0 Comments

问题的原因是希望能够在重叠的ItemsControl中捕获鼠标点击事件。解决方法是使用HitTest来判断鼠标点击的位置,并根据点击的位置来判断是点击了Ellipse还是Rectangle。

首先,在XAML中创建了两个ItemsControl,分别用于显示Ellipse和Rectangle。然后,为每个ItemsControl的ItemTemplate中的Ellipse和Rectangle添加了MouseDown事件处理程序shape_MouseLeftButtonDown。

接下来,在shape_MouseLeftButtonDown事件处理程序中,使用Mouse.GetPosition方法获取鼠标点击的位置。然后,使用VisualTreeHelper.HitTest方法来获取点击位置处的可视元素。将可视元素添加到hitResultsList中。

最后,遍历hitResultsList,判断可视元素是Ellipse还是Rectangle,并进行相应的处理。

然而,虽然这个解决方法能够解决鼠标点击问题,但是却无法保留WPF控件下面的控件的能力。例如,如果鼠标指针位于Ellipse下面的Rectangle上方,并且Ellipse中有一个TextBox控件,那么当鼠标指针位于Ellipse上方时,鼠标指针不会变为文本输入指针,并且无法直接编辑TextBox。为了解决这个问题,可以改用MouseMove事件,并根据鼠标光标下方是否有Ellipse来设置ItemsControl的IsHitTestVisible属性。

这个解决方法相对简单易行。

0