WPF/Silverlight – Mais où sont mes évènement dans mon Canvas ?

1 minute read

Aujourd’hui j’ai décidé d’écrire un petit article pour répondre à une question qui revient très régulièrement.

Prenez le XAML suivant :

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <Grid>
        <Canvas x:Name="canvas"
                MouseLeftButtonDown="OnMouseLeftButtonDown"
                MouseLeftButtonUp="OnMouseLeftButtonUp">
            <Ellipse x:Name="ellipse" Width="100" Height="100" Fill="Green" />
            <Ellipse x:Name="smallEllipse" Width="10" Height="10" Fill="Blue" />
        </Canvas>
    </Grid>
</Window>

Cette application très compliquée contient un Canvas et deux Ellipse une petite en bleu et une grande en vert. J’ai placé deux évènements sur le canvas dont voici les handlers :

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    smallEllipse.Fill = new SolidColorBrush(Colors.Red);
}

private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    smallEllipse.Fill = new SolidColorBrush(Colors.Blue);
}

L’idée est donc que lorsque que je clique quelque part dans mon Canvas ca change la couleur de la petite Ellipse. Si vous lancez l’application maintenant vous pourrez constater quelquechose d’étrange au premier abord, la petite ellipse ne change de couleur que lorsque l’on clique sur la grande Ellipse et non lorsque l’on clique sur les parties vides de Canvas!

Maintenant essayez de mettre une couleur de fond au canvas quelque chose comme Transparent par exemple :

Background="Transparent"

Si l’on relance l’application, aucun changement d’apparence n’est à constater cependant les évènements sont désormais lancés comme on l’attendais au premier abord.

Alors pourquoi cela ?

Tout simplement car la couleur de fond initiale de Canvas est nulle :

Background="{x:Null}"

Même si graphiquement on ne constate pas de différence il faut noter que l’absence de fond représentée par la valeur nulle n’as pas la même signification que la présence d’un fond transparent. Ce dernier étant un objet il “conduit” les évènements alors qu’un background nul non.

Updated:

Leave a Comment