2008-10-14 12 views
6

Je commence tout juste avec Silverlight (2 RC0) et n'arrive pas à faire fonctionner ce qui suit. Je veux créer un simple contrôle d'utilisateur de bouton d'image.Silverlight ImageButton UserControl

Mon XAML pour le contrôle de l'utilisateur est la suivante:

<Button> 
     <Button.Template> 
      <ControlTemplate> 
       <Image Source="{TemplateBinding ImageSource}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" /> 
      </ControlTemplate> 
     </Button.Template> 
    </Button> 

Le code se cache derrière comme suit:

public partial class ImageButtonUserControl : UserControl 
    { 
     public ImageButtonUserControl() 
     { 
      InitializeComponent(); 
     } 

     public Image Source 
     { 
      get { return base.GetValue(SourceProperty) as Image; } 
      set { base.SetValue(SourceProperty, value); } 
     } 
     public static readonly DependencyProperty SourceProperty = 
      DependencyProperty.Register("SourceProperty", typeof(Image), typeof(ImageButtonUserControl),null); 
    } 

Je veux être en mesure de créer dynamiquement les ImageButtons et les choses dans un conteneur comme un WrapPanel: Supposons que nous avons déjà une image nommée "image":

ImageButtonUserControl imageButton = new ImageButtonUserControl(); 
imageButton.Source = image; 
this.thumbnailStackPanel.Children.Add(imageButton); 

Que dois-je faire pour afficher l'image? Je suppose que je dois faire quelque chose avec DataContext, mais je ne suis pas tout à fait sûr de quoi ou où.

Merci pour toute aide

Répondre

10

Vous pouvez obtenir un ImageButton facilement en Templating un bouton ordinaire de sorte que vous ne nécessitent pas un UserControl du tout. En supposant que Button.Content sera l'ImageSource. Le ControlTemplate du bouton sera:

<ControlTemplate x:Key="btn_template">   
    <Image Source="{TemplateBinding Content}" /> 
</ControlTemplate> 

Et l'utilisation en tant ItemsControl avec la collection d'URL comme ItemsSource, vous pouvez ajouter WrapPanel comme ItemPanel. La valeur par défaut sera StackPanel si vous n'en spécifiez pas.

<DataTemplate x:Key="dataTemplate"> 
    <Button Template="{StaticResource btn_template}" Content="{Binding}"/> 
</DataTemplate>  


<ItemsControl ItemsSource="{Binding UrlCollection}" ItemsTemplate="{StaticResource dataTemplate}"/> 
+0

Merci, c'était une faute de frappe que j'avais déjà corrigé .... ça ne semble toujours pas fonctionner. – ckarbass

+0

hmm ... il a déjà une largeur et une hauteur, je pense qu'il a à voir avec DataContext ... – ckarbass

+0

que l'utilisation se traduira par un bouton avec une image à l'intérieur. Je veux une image cliquable (sans le bouton par défaut l'encapsulant visuellement) .... Je crois que le code que j'ai ci-dessus remplace complètement le modèle de bouton par défaut avec l'image. – ckarbass