2011-01-03 3 views
5

Je développe actuellement une application en C# en utilisant WPF. Ce que je dois pouvoir faire est sur une étiquette faire leur être une image à gauche du texte de l'étiquette une petite image d'un X ou une petite image d'une tique selon les circonstances. J'ai les images incluses dans le projet dans un dossier nommé images.ajouter une image à une étiquette dans wpf?

Comment puis-je affecter par programme les images à placer à gauche de l'étiquette dans le code et ne pas utiliser le code XAML.

Répondre

2

Puisque vous voulez dans votre code derrière et non dans XAML Je suggère amerrissage forcé le Label et en utilisant un StackPanel couplé à un Image et TextBlock comme on le voit ci-dessous où MyGrid pourrait être un conteneur ...

 <Grid Name="MyGrid"/> 

... alors dans votre code derrière ...

 StackPanel myStackPanel = new StackPanel(); 
     myStackPanel.Orientation = Orientation.Horizontal; 

     Image myImage = new Image(); 
     BitmapImage myImageSource = new BitmapImage(); 
     myImageSource.BeginInit(); 
     myImageSource.UriSource = new Uri("Images/MyImage.png"); 
     myImageSource.EndInit(); 
     myImage.Source = myImageSource; 

     TextBlock myTextBlock = new TextBlock(); 
     myTextBlock.Text = "This is my image"; 

     myStackPanel.Children.Add(myImage); 
     myStackPanel.Children.Add(myTextBlock); 

     MyGrid.Children.Add(myStackPanel); 
+0

Greate réponse !! – CharlieShi

4

Vous pouvez groupe ceci à l'intérieur d'une grille:

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Image Grid.Column="0" Source="{Binding ImageSourceProperty}" /> 
    <Label Grid.Column="1" Content="{Binding LabelTextProperty}" /> 
</Grid> 

Ou, puisque l'étiquette est un contrôle de contenu, vous pouvez simplement mettre le contrôle d'image dans un contrôle d'étiquette:

<Label> 
    <Image Source="{Binding ImageSourceProperty}" /> 
    My Text 
</Label> 

Une fois vous savez comment le xaml devrait ressembler, il est très facile de créer les mêmes éléments via le code.

+2

Votre second exemple ne fonctionne pas. ContentControl ne peut avoir qu'un seul enfant, et vous lui donnez deux (l'image et le texte). Vous devez envelopper un StackPanel autour d'eux, par ex. '' –

+0

Vous avez raison, vous ne devez pas penser directement quand j'ai écrit celui-là. –

+0

@Joe: Votre code ne fonctionne pas non plus - Une valeur de type 'String' ne peut pas être ajoutée à une collection ou un dictionnaire de type 'UIElementCollection' – Casebash

1

Je ne suis pas d'accord avec les deux autres réponses ici. Il n'est pas nécessaire d'ajouter une grille pour envelopper le contenu. Le panneau de la pile est suffisant.

Dans le xaml, ajoutez un panneau de piles là où vous avez besoin du contenu.

<StackPanel Name="myStack" Orientation="Horizontal"></StackPanel> 

Puis dans le code derrière, comme dans un gestionnaire de bouton ou lorsque les charges de fenêtre ajouter cette

Image coolPic = new Image() { 
    Name="pic", 
    Source = new BitmapImage(new Uri("pack://application:,,,/images/cool.png")), 
    Stretch = Stretch.None // this preserves the original size, fill would fill 
}; 

TextBlock text = new TextBlock() { 
    Name = "myText", 
    Text = "This is my cool Pic" 
}; 

myStack.Children.Add(coolPic); // adding the pic first places it on the left 
myStack.Children.Add(text); // the text would show up to the right 

Vous pouvez échanger l'emplacement de l'image et le texte en ajoutant le texte d'abord, puis la image.

Si vous ne voyez pas l'image, vérifiez que l'action de construction de l'image est définie sur ressource dans la fenêtre des propriétés de l'image. Pour que le code soit plus utile et/ou plus dynamique, vous avez besoin d'un moyen de modifier le texte ou l'image.

Disons donc que vous ne vouliez changer ceux-ci et aller de l'avant et faire une

((TextBlock)FindName("myText")).Text = "my other cool pic"; 

que vous attendez que le texte soit modifié, mais ce qui se passe?

Object reference not set to an instance of an object. 

Drats mais je lui ai donné un nom. Vous devez ajouter

// register the new control 
RegisterName(text.Name, text); 

Pour que vous puissiez accéder au bloc de texte plus tard. Cela est nécessaire car vous avez ajouté le contrôle au framework après sa construction et son affichage.Donc, le code final ressemble à ceci après l'enregistrement de l'image aussi

Image coolPic = new Image() { 
    Name="pic", 
    Source = new BitmapImage(new Uri("pack://application:,,,/images/cool.png")), 
    Stretch = Stretch.None // this preserves the original size, fill would fill 
}; 

// register the new control 
RegisterName(coolPic.Name, coolPic); 

TextBlock text = new TextBlock() { 
    Name = "myText", 
    Text = "This is my cool Pic" 
}; 

// register the new control 
RegisterName(text.Name, text); 

myStack.Children.Add(coolPic); 
myStack.Children.Add(text); 
Questions connexes