C# 使用椭圆模板将按钮图像从播放更改为单击时暂停

C# 使用椭圆模板将按钮图像从播放更改为单击时暂停,c#,wpf,button,background-image,ellipse,C#,Wpf,Button,Background Image,Ellipse,我有一个播放按钮,我想改变背景图像,所以它看起来像一个暂停按钮时,点击,我已经看到了很多如何做到这一点的指南,但我的椭圆模板似乎使我的代码有很大的不同于我所研究的任何东西。这是我的密码: <Button HorizontalAlignment="Left" Width="40" Height="40" Click="Button_Click_2"> <Button.Template> <ControlT

我有一个播放按钮,我想改变背景图像,所以它看起来像一个暂停按钮时,点击,我已经看到了很多如何做到这一点的指南,但我的椭圆模板似乎使我的代码有很大的不同于我所研究的任何东西。这是我的密码:

        <Button HorizontalAlignment="Left" Width="40" Height="40" Click="Button_Click_2">
        <Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Ellipse Stroke="Black">
                        <Ellipse.Fill>
                            <ImageBrush ImageSource="Images/play.png"/>
                        </Ellipse.Fill>
                    </Ellipse>
                    </Grid>
                </ControlTemplate>
            </Button.Template>
        </Button>

我认为您应该使用一个ToggleButton(一个具有选中和未选中状态的按钮),并具有一个触发器,当选中按钮时,可以更改其模板(或仅更改背景的图像源)。

ToggleButton解决方案(如其他用户的回答中所建议的)可能最适合您。然而,为了完整性,我发布了另一种方法

XAML:

转换器:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace WpfTestBench
{
    public class BoolToVisibilityConverter : MarkupExtension, IValueConverter
    {
        private static BoolToVisibilityConverter _instance;

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var visibility = Visibility.Hidden;

            if (parameter != null)
                visibility = (Visibility)parameter;

            return visibility == Visibility.Visible
                ? (((bool)value) ? Visibility.Visible : Visibility.Hidden)
                : (((bool)value) ? Visibility.Hidden : Visibility.Visible);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }

        #endregion

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return _instance ?? (_instance = new BoolToVisibilityConverter());
        }
    }
}
using System.ComponentModel;
using System.Windows;

namespace WpfTestBench
{
    public partial class PlayButton
    {
        public PlayButton()
        {
            InitializeComponent();
            DataContext = new SampleContext();
        }

        private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            var context = DataContext as SampleContext;

            if (context == null)
                return;

            context.IsPlaying = !context.IsPlaying;
        }
    }

    public class SampleContext : INotifyPropertyChanged
    {
        private bool _isPlaying;

        public bool IsPlaying
        {
            get { return _isPlaying; }
            set
            {
                if (_isPlaying == value)
                    return;

                _isPlaying = value;

                OnPropertyChanged("IsPlaying");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;

            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace WpfTestBench
{
    public class BoolToVisibilityConverter : MarkupExtension, IValueConverter
    {
        private static BoolToVisibilityConverter _instance;

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var visibility = Visibility.Hidden;

            if (parameter != null)
                visibility = (Visibility)parameter;

            return visibility == Visibility.Visible
                ? (((bool)value) ? Visibility.Visible : Visibility.Hidden)
                : (((bool)value) ? Visibility.Hidden : Visibility.Visible);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }

        #endregion

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return _instance ?? (_instance = new BoolToVisibilityConverter());
        }
    }
}