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>
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
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? –
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