Trying to get OnMouse events appearing in a child FrameworkElement
. The parent element is a Panel
(and the Background
property is not Null).
class MyFrameworkElement : FrameworkElement
{
protected override void OnMouseDown(MouseButtonEventArgs e)
{
// Trying to get here!
base.OnMouseDown(e);
}
}
public class MyPanel : Panel
{
protected override void OnMouseDown(MouseButtonEventArgs e)
{
// This is OK
base.OnMouseDown(e);
}
}
OnMouse never gets called, event is always unhandled and Snoop tells me that the routed event only ever seems to get as far as the Panel
element.
<Window
x:Class="WpfApplication5.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication5"
Title="Window1" Height="300" Width="300">
<Border x:Name="myBorder" Background="Red">
<l:MyPanel x:Name="myPanel" Background="Transparent">
<l:MyFrameworkElement x:Name="myFE"/>
</l:MyPanel>
</Border>
</Window>
Docs say that FrameworkElement
handles Input, but why not in this scenario?
OnMouseDown
will only be called if your element responds to Hit Testing. See Hit Testing in the Visual Layer. The default implementation will do hit testing against the graphics drawn inOnRender
. Creating aPanel
with aTransparent
background works becausePanel
draws a rectangle over its entire area, and that rectangle will catch the hit test. You can get the same effect by overridingOnRender
to draw a transparent rectangle:You could also override
HitTestCore
so that all clicks are counted as hits:I was able to reproduce the scenario you described. I did some playing around, and it wasn't until I changed the base class of
MyFrameworkElement
fromFrameworkElement
to something more concrete, likeUserControl
that events started firing like they should. I'm not 100% sure why this would be, but I would recommend using one of the classes derived fromFrameworkElement
that would suit your needs (likePanel
, as you did in the example above, orButton
).I'd be curious to know the exact reason your example above produces these results...