2011-01-03 6 views
5

Attualmente sto sviluppando un'applicazione in C# usando WPF. Quello che devo essere in grado di fare è su un'etichetta, fare in modo che siano un'immagine alla sinistra del testo dell'etichetta una piccola immagine di una X o una piccola immagine di una spunta a seconda delle circostanze. Ho le immagini incluse nel progetto in una cartella denominata immagini.aggiungendo un'immagine a un'etichetta in wpf?

Come è possibile assegnare le immagini da posizionare a sinistra dell'etichetta in modo programmatico nel codice e non utilizzando il codice XAML.

risposta

2

Dal momento che si desidera che questo in codice dietro e non all'interno di XAML vorrei suggerire ammaraggio il Label e utilizzando un StackPanel accoppiato con un Image e TextBlock come si è visto sotto dove MyGrid potrebbe essere qualsiasi contenitore ...

 <Grid Name="MyGrid"/> 

... quindi nel tuo codice dietro ...

 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

Risposta immediata !! – CharlieShi

4

Puoi gruppo questo all'interno di una griglia:

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

Oppure, dal momento che l'etichetta è un controllo dei contenuti, si può semplicemente mettere il controllo delle immagini all'interno di un controllo etichetta:

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

volta sai come dovrebbe apparire l'xaml, è molto facile creare gli stessi elementi tramite codice.

+2

Il tuo secondo esempio non funziona. ContentControl può avere un solo figlio e tu ne stai dando due (l'immagine e il testo). Dovresti avvolgere uno StackPanel intorno ad essi, ad es. '' –

+0

Hai ragione, non devi pensare in modo diretto quando ho scritto quello. –

+0

@Joe: il tuo codice non funziona - Un valore di tipo 'String' non può essere aggiunto a una raccolta o dizionario di tipo 'UIElementCollection' – Casebash

1

Non sono d'accordo con le altre due risposte qui. Non è necessario aggiungere una griglia per avvolgere il contenuto. Lo stackpanel è sufficiente.

Nell'xaml aggiungere un pannello di stack al punto in cui è necessario il contenuto.

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

Poi nel codice dietro, come in un gestore di pulsante o quando i carichi window Aggiungi questa

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 

È possibile scambiare la posizione dell'immagine e il testo con l'aggiunta del testo prima poi il Immagine.

Se non si vede l'immagine, assicurarsi che l'azione di creazione dell'immagine sia impostata su risorsa nella finestra delle proprietà dell'immagine.

Affinché il codice sia più utile eo più dinamico, è necessario un modo per modificare il testo o l'immagine.

Quindi diciamo che si voleva cambiare quelle e di andare avanti e fare un

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

Ci si aspetta il testo da modificare, ma che succede?

Object reference not set to an instance of an object. 

Drats ma gli ho dato un nome. Dovresti aggiungere

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

In modo da poter accedere al blocco di testo in un secondo momento. Questo è necessario perché hai aggiunto il controllo al framework dopo che è stato creato e visualizzato.Quindi il codice finale appare così dopo aver registrato anche l'immagine

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); 
Problemi correlati