web-dev-qa-db-fra.com

Changement de programme icône de bouton dans WPF

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?

15
BSchlinker

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.

29
d.moncada

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;

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.

4
ChrisF

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 ...

2
Jan

Essayez ce code

window.Icon = BitmapFrame.Create(Application.GetResourceStream(new Uri("LiveJewel.png", UriKind.RelativeOrAbsolute)).Stream);
0
Joee