Программно меняющийся значок кнопки в WPF - PullRequest
16 голосов
/ 12 мая 2011

У меня в настоящее время есть кнопка, на которой есть значок / изображение.Я настроил кнопку и изображение в 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>

Мне нужно иметь возможность программно изменить изображение этой кнопки с playIcon на stopIcon.Как я могу это сделать?

Ответы [ 4 ]

30 голосов
/ 12 мая 2011

Это можно сделать, изменив содержимое кнопки с помощью обработчика событий.

Вы можете установить значок «Воспроизведение» и значок «Стоп» в качестве ресурса, под Window.Resources, например, так:

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

Теперь, когдакнопка нажата, вы можете просто изменить содержимое кнопки на другой ресурс (значок остановки).В обработчике событий кнопки вы можете сделать это:

C #

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (MediaButton.Content == FindResource("Play"))
    {
        MediaButton.Content = FindResource("Stop");
    }
    else
    {
        MediaButton.Content = FindResource("Play");
    }
}

Редактировать: более короткая запись

MediaButton.Content = FindResource(MediaButton.Content == FindResource("Play") ? "Stop" : "Play");

Надеюсь, это поможет, дайте мне знать, если у вас естьбольше вопросов.

5 голосов
/ 12 мая 2011

Если у вас есть определение вашего изображения что-то вроде этого:

<Image Source="{Binding ImageSource}" Stretch="Fill"/>

Тогда в вашем коде, где вы хотите сделать переключатель, просто введите:

ImageSource = image;

, где image определяется как:

image = new BitmapImage(new Uri("/Application;component/Resources/pause.png", UriKind.Relative));

Конечно, это зависит от того, используете ли вы шаблон MVVM и реализуете интерфейс INotifyPropertyChanged в своем коде.

3 голосов
/ 12 мая 2011

Использование DataTrigger (правка) в стиле изображения (/ правка) при условии изменения:

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

В этом случае переменная myCondition будет логическим свойством в вашей ViewModel (или, в более общем смысле, DataContext элемента управления), что-то вроде

public bool myCondition { get { return ([whatever that condition might be]); } }

Это может также включать установщик и может быть простым автоматическим свойством. Как и в случае другого ответа MVVM, для реализации INotifyPropertyChanged.

он будет полагаться на ViewModel.

Приятно то, что как только условие больше не выполняется, DataTrigger автоматически установит для свойства Source исходное значение.

Отказ от ответственности: У меня нет возможности проверить это прямо сейчас, поэтому возьмите это с крошкой соли и, возможно, с некоторыми усилиями по отладке ...

0 голосов
/ 12 августа 2016

Попробуйте этот код

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