2010-10-12 13 views
2

Je veux faire un bouton personnalisé en utilisant wpf. Le bouton sera utilisé pour contrôler un mediaplayer. le type (lecture, arrêt, pause, ...) du bouton est spécifiée en utilisant une énumérationcontrôle de bouton personnalisé WPF

namespace vgtunesWPF 
{ 
public class MediaButton : Button 
{ 
    [Browsable(true)] 
    public Button_Type ButtonType 
    { 
     get { return (Button_Type)GetValue(ButtonTypeProperty); } 
     set { SetValue(ButtonTypeProperty, value); } 
    } 

    public static readonly DependencyProperty ButtonTypeProperty = DependencyProperty.Register("ButtonType", typeof(Button_Type), typeof(MediaButton), new FrameworkPropertyMetadata(Button_Type.stop, FrameworkPropertyMetadataOptions.AffectsRender, ImageSourceChanged)); 
    static MediaButton() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MediaButton), new FrameworkPropertyMetadata(typeof(MediaButton))); 
    } 
    private static void ImageSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     Application.GetResourceStream(new Uri("pack://application:,,," + (string) e.NewValue)); 
    } 
} 
public enum Button_Type 
{ 
    play = 0, 
    pause = 1, 
    stop = 2, 
    forward = 3, 
    backward = 4 
} 
public class ButtonTypeConverter : IValueConverter 
{ 
    public object Convert(object value, Type TargetType, object Parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      Button_Type type = (Button_Type)value; 
      switch (type) 
      { 
       case Button_Type.play: 
        return new BitmapImage(new Uri("/vgtunesWPF;component/Images/Play.png",UriKind.Relative)); 
       case Button_Type.stop: 
        return new BitmapImage(new Uri("/vgtunesWPF;component/Images/Stop.png",UriKind.Relative)); 
       default: 
        break; 
      } 
     } 
     return null; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

Afin de convertir ButtonType à l'image de droite i créé un convertisseur. alors le XAML:

<Style TargetType="{x:Type local:MediaButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MediaButton}"> 
       <Canvas Width="30" Height="30"> 
        <Canvas.Resources> 
         <local:ButtonTypeConverter x:Key="Converter"/> 
        </Canvas.Resources> 
        <Image Name="Normal" Source="{Binding Source={StaticResource Converter}, Converter={StaticResource Converter},Path=}" /> 
        <Image Name="Disabled" Visibility="Hidden" Source="/vgtunesWPF;component/Images/PlayDisabled.png"/> 
       </Canvas> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="Normal" Property="Visibility" Value="Visible"/> 
         <Setter TargetName="Normal" Property="Effect"> 
          <Setter.Value> 
           <DropShadowEffect Color="AliceBlue" ShadowDepth="0" BlurRadius="15" /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/> 
         <Setter TargetName="Disabled" Property="Visibility" Value="Visible"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Le problème ici est que je veux lier ButtonType à l'image normale, mais je ne peux pas comprendre comment. Je ne peux pas obtenir ButtonType accessible dans le xaml

Répondre

1

Ok l'a résolu. Apparemment, je devais ajouter la source Relative

<Image Name="Normal" Source="{Binding Converter={StaticResource Converter}, Path=ButtonType, RelativeSource={RelativeSource TemplatedParent}}" /> 
0

peut-être que vous essayez de lier à votre propriété de dépendance "ButtonType".

<Image Name="Normal" Source="{Binding ButtonType, Converter={StaticResource Converter}"/> 
+0

merci mais ce n'est pas ça, pour une raison quelconque ButtonType n'est pas accessible en XAML –