Je souhaite utiliser un <Image>
dans mon application WPF qui répond aux clics de souris. Seuls les événements «Mouse Up» et «Moue Down» sont disponibles immédiatement. Je trouve cela plutôt particulier. Existe-t-il un moyen d'étendre le contrôle ou d'utiliser un autre contrôle pour obtenir le même effet?
Pour approfondir la réponse de Shawn Mclean, l'une des grandes capacités de WPF est la capacité de tirer parti du comportement d'un contrôle tout en modifiant complètement son apparence. Si vous souhaitez créer une image qui se comporte comme un bouton (avec des événements de clic, une liaison de commande, une affectation de bouton par défaut, etc.), vous pouvez placer une image dans un contrôle de bouton et modifier le style de ce bouton pour supprimer le bouton "chrome". Cela vous donnera l'API Nice d'un bouton avec le look que vous désirez. Vous pouvez réutiliser ce style. Cette approche vous évitera de créer des gestionnaires d’événements dans votre code si vous avez des commandes à associer à vos nouveaux boutons d’image.
Créer un tel style est assez facile. Créez simplement une nouvelle ressource de style avec une clé nommée dans une ressource et affectez cette ressource à la propriété Style de vos boutons. Voici un exemple que j'ai jeté ensemble:
<Window
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
x:Class="ButtonStyleTestApp.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">
<Window.Resources>
<Style x:Key="NoChromeButton" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="Chrome" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#ADADAD"/>
<Setter Property="Opacity" TargetName="Chrome" Value="0.5"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot" Background="#FF44494D">
<Button Style="{DynamicResource NoChromeButton}" Click="ButtonClicked" >
<Image Source="Desert.png" Stretch="None"/>
</Button>
</Grid>
</Window>
Utilisez MouseUp. De toute façon, vous ne pouvez pas naviguer dans le contrôle Image ni vous focaliser dessus, c’est le seul moyen de cliquer dessus.
Une autre option consiste simplement à placer l'image dans un bouton et à supprimer tous les styles en modifiant le modèle de contrôle afin qu'il ressemble à une image. De cette façon, vous pouvez vous concentrer dessus en utilisant le clavier.
Vous pouvez utiliser un ensemble de 4 gestionnaires et de 2 variables booléennes:
booléens:
gestionnaires:
Cette construction implémente les fonctionnalités du clic classique.
Une autre option consiste à envelopper une Image
dans une Hyperlink
, comme ceci:
<TextBlock>
<Hyperlink Command="{Binding VisitWebsiteCommand}"
CommandParameter="http://www.google.com"
Cursor="Hand"
TextDecorations="{x:Null}">
<Image Height="50"
Source="{StaticResource YourImageResource}"
Width="50" />
</Hyperlink>
</TextBlock>