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.
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>
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
}
Peut-être que MouseLeftButtonDown serait plus approprié.