【问题标题】:Changing a button Image from Play to Pause when clicked using an Ellipse template使用椭圆模板单击时将按钮图像从播放更改为暂停
【发布时间】:2013-11-26 11:38:04
【问题描述】:

我有一个播放按钮,我想更改背景图像,以便在单击时看起来像一个暂停按钮,我已经看过很多关于如何执行此操作的指南,但是我的 Ellipse 模板似乎使我的代码与任何东西大不相同我研究过。这是我的代码:

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

【问题讨论】:

    标签: c# wpf button background-image ellipse


    【解决方案1】:

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

    XAML:

    <Window x:Class="WpfTestBench.PlayButton"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfTestBench="clr-namespace:WpfTestBench"
        Title="Play button sample">
    <Button Width="40" Height="40" Click="Button_OnClick">
        <Button.Template>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Ellipse Stroke="Black" />
    
                    <Image Source="Play.png" Visibility="{Binding Path=IsPlaying, 
                        Converter={wpfTestBench:BoolToVisibilityConverter}, 
                        ConverterParameter={x:Static Visibility.Hidden}}" />
    
                    <Image Source="Pause.png" Visibility="{Binding Path=IsPlaying, 
                        Converter={wpfTestBench:BoolToVisibilityConverter}, 
                        ConverterParameter={x:Static Visibility.Visible}}" />
                </Grid>
            </ControlTemplate>
        </Button.Template>
    </Button>
    

    代码隐藏:

    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());
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我认为你应该使用一个togglebutton(一个有一个检查和未选中的状态的按钮),并且有一个触发器,当检查按钮时更改其模板(或只是背景的图像源)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        相关资源
        最近更新 更多