【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

イベントがすり抜ける

XAMLなしの以下のようなコードで、Pageにイベントが来なくてハマりました。

public class Page : UserControl
{
    public Page()
    {
        MouseLeftButtonDown += (sender, e) => Debug.WriteLine("Page");
    }
}

何か置かないといけないのかと思ってCanvasを置いてみましたが変化ありません。

var canvas = new Canvas();
canvas.MouseLeftButtonDown += (sender, e) => Debug.WriteLine("Canvas");
Content = canvas;

TextBlockを置いてみると、その上だけCanvasもPageも反応しました。

canvas.Children.Add(new TextBlock { Text = "TextBlock" });

XAMLを使ったプロジェクトでは何も置かなくても反応します。よく見るとBackgroundが設定されています。

<Grid x:Name="LayoutRoot" Background="White">

Canvasに設定したところ無事にイベントが捕捉出来ました。Pageに設定してもダメでした。

id:atsushienoさんからご指摘がありましたが、RectangleなどのShapeでもFillをnullにしておくとStrokeにしかイベントが来ません。Excelのオートシェイプと同じ挙動だと考えられそうです。