2011-01-03 12 views
5

Obecnie rozwijam aplikację w języku C# przy użyciu WPF. Muszę umieć na etykiecie, aby na obrazie etykiety po jej lewej stronie pojawił się mały obraz X lub mały obraz kleszcza w zależności od okoliczności. Mam obrazy zawarte w projekcie w folderze o nazwie images.dodanie obrazu do etykiety w wpf?

Jak mogę przypisać obrazy mają być umieszczone po lewej stronie etykiety programowo w kodzie, a nie przy użyciu kodu XAML.

Odpowiedz

2

Ponieważ chcesz to w kodzie tyłu a nie w XAML Proponuję wodowania LabelStackPanel i przy użyciu sprzężonego z Image i TextBlock jak widać poniżej, gdzie MyGrid może być dowolny pojemnik ...

 <Grid Name="MyGrid"/> 

... następnie w kodzie za ...

 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

Odpowiedź Greate !! – CharlieShi

4

Można grupa to wewnątrz sieci:

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

Albo, ponieważ etykieta jest kontrola zawartości, można po prostu umieścić kontrolę obrazu wewnątrz formantu etykiecie:

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

Raz wiesz jak powinien wyglądać Xaml, bardzo łatwo jest stworzyć te same elementy za pomocą kodu.

+2

Twój drugi przykład nie działa. ContentControl może mieć tylko jedno dziecko, a ty dajesz mu dwa (Obraz i tekst). Będziesz musiał owinąć wokół nich StackPanel, np. '' –

+0

Masz rację, nie wolno myśleć prosto, kiedy to napisałem. –

+0

@Joe: Twój kod również nie działa - wartości typu "String" nie można dodać do kolekcji lub słownika typu "UIElementCollection" – Casebash

1

Nie zgadzam się z dwoma innymi odpowiedziami tutaj. Nie ma potrzeby dodawania siatki do zawijania zawartości. Panel sterujący jest wystarczający.

W pliku xaml dodaj panel sterujący do miejsca, w którym ma się znaleźć zawartość.

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

Następnie w kod tyłu, jak w obsługi przycisku lub po załadowaniu window Dodaj ten

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 

Można zamienić położenie obrazu i tekstu, dodając tekst pierwszy wówczas obraz.

Jeśli nie widzisz obrazu zapewniają build działanie obrazie jest ustawiony do zasobów w oknie właściwości obrazu.

Aby kod był bardziej użyteczny lub bardziej dynamiczny, potrzebny byłby sposób zmiany tekstu lub obrazu.

Więc powiedzmy, że chciał zmienić te i iść dalej i zrobić

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

Można by oczekiwać, że tekst ma być zmieniony, ale co się dzieje?

Object reference not set to an instance of an object. 

Drats ale ja dałem to nazwisko. Musisz dodać:

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

Aby uzyskać dostęp do bloku tekstowego później. Jest to potrzebne, ponieważ dodano kontrolę do struktury po jej zbudowaniu i wyświetleniu.Tak więc ostateczny kod wygląda tak po zarejestrowaniu obrazu:

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