2015-05-11 13 views
6

Sto eseguendo il porting di una vecchia applicazione desktop WinForms su WPF. La GUI dell'app ha utilizzato WinForm PictureBox per visualizzare le immagini. La vecchia app WinForms disponeva anche di gestori di eventi OnClick per tutti i PictureBox. Fare clic sulle immagini in realtà ha fatto qualcosa di importante. Ora che sto rifacendo l'interfaccia utente in WPF, ho scoperto come per this che l'equivalente per il controllo PictureBox di WinForm è WPF Image. Tuttavia, quando ho aperto il pannello delle proprietà per il WPF Image, non si sono verificati click da trattare, così non ho potuto scrivere un gestore di eventi click come ho avuto in WinForms.Fare clic su Evento per immagine WPF

Quindi, per favore, può dirmi cosa si può fare per ottenere l'equivalente di PictureBox di WinForm e l'evento di clic in WPF? Voglio visualizzare le immagini e gestire il caso ogni volta che l'utente fa clic sull'immagine.

risposta

6

In WPF ogni controllo ha il suo modello predefinito (come sembra) ma è possibile modificare facilmente questi modelli e rendere i controlli come si desidera. Ciò rende più facile scegliere il controllo in base alla sua funzionalità e farlo apparire come desideri. Nel tuo caso si vuole Click in modo da scegliere Button e cambiare il suo 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> 

Con il XAML sopra Image sarà la vostra Button

EDIT

Qui di seguito potete trovare la versione semplificata di come bind/change Image.Source dove tutto è fatto in MainWindow ma fondamentalmente in WPF non si manipolano i controlli ma si legano le loro proprietà usando Binding e mani pulire queste proprietà. Normalmente si dovrebbe creare una classe dedicata (ViewModel). La classe ha bisogno di implementare INofityPropertyChanged interfaccia, DataContext deve essere impostato di conseguenza e la proprietà legata bisogno di raccogliere INofityPropertyChanged.PropertyChanged evento ogni volta che il suo valore è cambiato (è così che si comunica UI per aggiornare il valore)

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)); 
    }  
} 

e in XAML:

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

Inoltre, poiché sta utilizzando WPF, potrebbe essere meglio se utilizza MVVM e anziché l'evento Click utilizza un comando. Ma ciò dipende da ciò che vuole raggiungere. Ha detto che il clic ha fatto qualcosa di importante, quindi è possibile che il comando potrebbe essere una soluzione migliore. – Dzyann

+0

Quindi, stiamo prendendo un pulsante e lo facciamo apparire come un'immagine. Potete per favore mostrarmi come istanziate i pulsanti di questo stile? Inoltre, è possibile impostare l'immagine per il pulsante immagine dal gestore di un altro pulsante invece di XAML? –

+0

Come usare il pulsante è già nel mio XAML. Per quanto riguarda il modo in cui cambiare l'immagine sorgente, è diverso anche da WinForms. Non si opera sui controlli in WPF. Si crea una proprietà con l'origine dell'immagine (ad esempio del tipo 'ImageSource'), si associa a' Image.Source' usando 'Binding' e quindi si manipola quella proprietà e non il controllo. – dkozl

10

Basta aggiungere un evento MouseDown per la vostra immagine in questo modo

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

che dovrebbe aggiungere questo al vostro c ode dietro

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

Questa è una buona e semplice soln – Karan

0

Forse MouseLeftButtonDown sarebbe più appropriato.