2013-11-26 2 views
0

클릭하면 일시 중지 버튼처럼 보이게 배경 이미지를 변경하려는 재생 버튼이 있습니다. 이미 수행 방법에 대한 많은 가이드를 보았습니다. 이 그러나 내 타원 서식 파일 내 코드를 내가 연구 한 것과 많이 다른 것으로 보입니다. 여기 내 코드입니다 : 나는 당신이 ToggleButton을 (체크와 체크되지 않은 상태가 버튼)를 사용한다고 생각하고, 트리거를타원 템플릿을 사용하여 클릭하면 재생에서 일시 중지 버튼 이미지로 변경

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

답변

2

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> 

은 Codebehind가 :

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

매우 유용하고 완벽했다! –

0

그 버튼이 선택되어 변화의 템플릿 (또는 단지 imagesource 배경).