web-dev-qa-db-fra.com

Cliquez sur l'événement pour l'image WPF

Je porte une ancienne application WinForms Desktop sur WPF. L’interface graphique de l’application a utilisé la variable PictureBox de WinForm pour afficher des images. L'ancienne application WinForms comportait également des gestionnaires d'événements OnClick pour tous les PictureBox. En cliquant sur les images fait quelque chose d'important. Maintenant que je refais l'interface utilisateur dans WPF, j'ai découvert, d'après this , que l'équivalent du contrôle PictureBox de WinForm est Image de WPF. Cependant, lorsque j'ai ouvert le panneau de propriétés pour WPF Image, il n'y avait aucun événement click à gérer, je ne pouvais donc pas écrire de gestionnaire d'événement de clic comme dans WinForms. 

Alors, pouvez-vous s'il vous plaît me dire ce qui peut être fait pour atteindre l'équivalent de la variable PictureBox de WinForm et son événement de clic dans WPF? Je souhaite afficher des images et gérer le cas chaque fois que l'utilisateur clique sur l'image.

6
The Vivandiere

Dans WPF, chaque contrôle a son modèle par défaut (son apparence) mais vous pouvez facilement modifier ces modèles et faire en sorte que les contrôles ressemblent à vos souhaits. Cela facilite la sélection du contrôle par ses fonctionnalités et lui donne l’impression que vous souhaitez. Dans votre cas, vous voulez Click afin de choisir Button et de changer sa Template

<Window ...>
    <Window.Resources>
        <Style TargetType="{x:Type Button}" x:Key="ImageButtonStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <ContentPresenter/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Button Style="{StaticResource ImageButtonStyle}" Click="ImageButton_Click">
        <Image Source="..."/>
    </Button>
</Window>

Avec ce qui précède, XAML Image sera votre Button

EDIT

Vous trouverez ci-dessous une version simplifiée de la procédure de liaison/modification de Image.Source dans laquelle tout est fait dans MainWindow mais, dans WPF, vous ne manipulez pas les contrôles, mais vous liez leurs propriétés à l'aide de Binding et manipulez ces propriétés. Normalement, vous créez une classe dédiée (ViewModel). Votre classe doit implémenter INofityPropertyChanged interface, DataContext doit être définie en conséquence et la propriété liée doit générer un événement INofityPropertyChanged.PropertyChanged chaque fois que sa valeur est modifiée (vous indiquez à l'UI de rafraîchir la valeur)

public partial class MainWindow : Window, INotifyPropertyChanged
{
   public MainWindow()
   {
      InitializeComponent();
      DataContext = this;
   }

   private ImageSource _myImageSource;

   public ImageSource MyImageSource
   {
      get { return _myImageSource; }
      set
      {
          _myImageSource = value;
          OnPropertyChanged("MyImageSource");
      }
   }

   private void ImageButton_Click(object sender, RoutedEventArgs e)
   {
       this.MyImageSource = new BitmapImage(...); //you change source of the Image
   }

   public event PropertyChangedEventHandler PropertyChanged;

   private void OnPropertyChanged(string propertyName)
   {
      var handler = PropertyChanged;
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
   }    
}

et dans le XAML:

<Button Style="{StaticResource ImageButtonStyle}" Click="ImageButton_Click" Width="..." Height="...">
    <Image Source="{Binding MyImageSource}"/>
</Button>
8
dkozl

Ajoutez simplement un événement MouseDown à votre image

<Image x:Name=aPicture Source="mypic.jpg" MouseDown="aPicture_MouseDown"/>

ce qui devrait ajouter cela à votre code derrière

private void aPicture_MouseDown(object sender, MouseEventArgs e)
{
   //do something here
}
15
CJK

Peut-être que MouseLeftButtonDown serait plus approprié.

1
AngelBlueSky