J'ai actuellement un bouton avec une icône/image. J'ai configuré le bouton et l'image en XAML:
<Button Height="69" HorizontalAlignment="Left" Margin="-2,0,0,0" Name="toggleBroadcast" VerticalAlignment="Top" Width="64" Grid.Row="1" Opacity="0.5" Click="changeBroadcastState_Click">
<Image Source="Images\playIcon.png" />
</Button>
Je dois pouvoir modifier par programmation l'image de ce bouton de playIcon à stopIcon. Comment puis-je faire ceci?
Vous pouvez accomplir cela en modifiant le contenu du bouton, via un gestionnaire d'événements.
Vous pouvez définir les icônes "Jouer" et "Arrêter" comme ressource, sous Window.Resources
comme suit:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Image x:Key="Play" Source="/WpfApplication1;component/Play_Icon.png" Height="50" Width="50" />
<Image x:Key="Stop" Source="/WpfApplication1;component/Stop_Icon.png" Height="50" Width="50"/>
</Window.Resources>
<Grid>
<Button Click="Button_Click" Name="MediaButton">
<DynamicResource ResourceKey="Play"/>
</Button>
</Grid>
Maintenant, lorsque le bouton est cliqué, vous pouvez simplement changer le contenu du bouton en une ressource différente (l'icône d'arrêt). Dans le gestionnaire d'événements du bouton, vous pouvez faire ceci:
C #
private void Button_Click(object sender, RoutedEventArgs e)
{
if (MediaButton.Content == FindResource("Play"))
{
MediaButton.Content = FindResource("Stop");
}
else
{
MediaButton.Content = FindResource("Play");
}
}
Edit: notation plus courte
MediaButton.Content = FindResource(MediaButton.Content == FindResource("Play") ? "Stop" : "Play");
J'espère que cela vous aidera, faites-le moi savoir si vous avez d'autres questions.
Si vous avez votre définition d'image quelque chose comme ça:
<Image Source="{Binding ImageSource}" Stretch="Fill"/>
Ensuite, dans votre code où vous voulez faire le changement, il vous suffit de:
ImageSource = image;
où image
est défini comme:
image = new BitmapImage(new Uri("/Application;component/Resources/pause.png", UriKind.Relative));
Bien sûr, cela dépend de votre utilisation du modèle MVVM et de l'implémentation de l'interface INotifyPropertyChanged
dans votre code.
Utilisez un DataTrigger (edit) dans le style de l'image (/ edit) sur la condition de modification:
<Button Height="69" HorizontalAlignment="Left" Margin="-2,0,0,0" Name="toggleBroadcast" VerticalAlignment="Top" Width="64" Grid.Row="1" Opacity="0.5" Click="changeBroadcastState_Click">
<Image>
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="Images\playIcon.png" />
<Style.Triggers>
<DataTrigger Binding="{Binding myCondition}" Value="True">
<Setter Property="Source" Value="Images\stopIcon.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Button>
La variable myCondition
serait alors une propriété booléenne dans votre ViewModel (ou, plus généralement, le DataContext du contrôle), quelque chose comme
public bool myCondition { get { return ([whatever that condition might be]); } }
Cela peut également inclure un setter et pourrait aussi bien être une simple propriété auto. Comme pour l'autre réponse MVVM, le ViewModel sera implémenté pour implémenter INotifyPropertyChanged
.
Ce qui est bien, c'est qu'une fois la condition remplie, DataTrigger définira automatiquement la propriété Source à sa valeur d'origine.
Avertissement: Je n'ai aucun moyen de tester cela pour le moment, alors prenez ceci avec un grain de sel et probablement un peu d'effort de débogage ...
Essayez ce code
window.Icon = BitmapFrame.Create(Application.GetResourceStream(new Uri("LiveJewel.png", UriKind.RelativeOrAbsolute)).Stream);