Contrôle D'Image WPF avec Événement de clic

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. Je trouve cela assez particulier. Est-il un moyen d'étendre le contrôle ou une façon d'utiliser l'autre pour donner le même effet?

35
demandé sur Kivin 2010-11-11 07:33:13

4 réponses

pour développer la réponse de Shawn Mclean, une des grandes capacités de WPF est la capacité de tirer parti du comportement d'un contrôle tout en changeant complètement l'apparence de ce contrôle. Si vous voulez créer une image qui se comporte comme un bouton (complet avec les événements de clic, liaison de commande, assignation de bouton par défaut, etc.) vous pouvez placer une image dans un bouton de commande et restyle ce bouton pour supprimer le bouton "chrome". Cela vous donnera l'API agréable d'un bouton avec le regard que vous désir. Vous pouvez réutiliser ce style et cette approche réduira le besoin de créer des gestionnaires d'événements dans votre code derrière si vous avez des commandes à lier à vos nouveaux boutons d'image.

créer un tel style est assez facile. Créez simplement une nouvelle ressource style avec une clé nommée dans une ressource et assignez cette ressource à la propriété Style de vos boutons. Voici un exemple que j'ai rassemblé:

<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>
67
répondu C8H10N4O2 2010-11-11 05:38:06

Utilisez MouseUp. Vous ne pouvez pas tabasser ou se concentrer sur le contrôle de L'Image de toute façon donc thats la seule façon de le cliquer.

une autre option est de simplement mettre l'image dans un bouton et supprimer tous les styles en éditant le modèle de contrôle de sorte qu'il semble juste une image. De cette façon, vous pouvez vous concentrer sur l'aide du clavier.

29
répondu Shawn Mclean 2010-11-11 04:38:06

vous pouvez utiliser un ensemble de 4 gestionnaires et 2 variables booléennes:

booléens:

  1. IsClicked
  2. Isentred

gestionnaires:

  1. OnMouseDown-sets IsClicked true;
  2. OnMouseEnter-sets IsEntered true;
  3. OnMouseLeave-sets IsEntered false;
  4. OnMouseUp-if (IsClicked && IsEntered){ / TODO votre logique /} et puis définit IsClicked false;

cette construction implémente la fonctionnalité du clic classique.

1
répondu Semm 2015-01-07 14:38:38
  1. OnMouseLeave - also set isclicked to false; Sinon, vous pouvez cliquer la souris loin et relâcher la souris. Puis cliquez sur la souris et relâchez la souris pour toujours faire un clic se produire.
-1
répondu Willem 2015-07-06 23:03:03