2011-11-03 108 views
10

我已经创建了几个带有透明背景的画布,并且想对它做一些移动事件。透明背景上的鼠标事件

但是,我发现所有鼠标事件(例如MouseLeftButtonDown)都无法使用canvas的背景为Null或Transparent。但是,如果我将背景设置为某种纯色(例如,红色或蓝色),则鼠标事件功能良好。

为什么?

我可以使用透明背景正确设置鼠标事件功能吗?

谢谢!

回答

25

我不确定为什么你会得到你得到的结果,但是当背景透明时(即你明确地将它设置为Brushes.Transparent,通过XAML或代码)它应该可以正常工作。如果它为null,那么WPF将不会将它包含在命中测试中,因此它将不符合鼠标事件的条件。

参见例如http://msdn.microsoft.com/en-us/library/ms752097.aspx视觉对象,它是透明的,也可以点击测试。

很可能是因为其他的UIElement的是你的画布前捕捉and handling鼠标事件的元素树看到它(通过设置e.Handled即到true

+0

谢谢,解决方案的确是为我的StackPanel显式设置Background =“Transparent”。 – Borzh

13

Transparent对鼠标事件做出反应,这就是它的全部要点,你确定你甚至击中了画布?

这里有一个唯一的XAML的例子:

<Border Width="300" Height="300" BorderBrush="Black" BorderThickness="1"> 
    <Canvas Background="Transparent"> 
     <Canvas.Triggers> 
      <EventTrigger RoutedEvent="Canvas.MouseLeftButtonDown"> 
       <BeginStoryboard> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background"> 
          <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Brushes.Red}"/> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Canvas.Triggers> 
    </Canvas> 
    </Border> 

如果通过删除将不再发生反应的属性设置的Backgroundnull,无论是显式或隐式。

7

请注意,将背景设置为透明而不是将其设置为透明(或将其设置为空)不同。我的经验是,命中测试是透明的,而不是空背景。