2011-01-03 58 views
5

Actualmente estoy desarrollando una aplicación en C# usando WPF. Lo que tengo que hacer es colocar en una etiqueta una imagen a la izquierda del texto de la etiqueta, una imagen pequeña de una X o una imagen pequeña de un tic dependiendo de las circunstancias. Tengo las imágenes incluidas en el proyecto en una carpeta llamada imágenes.agregar una imagen a una etiqueta en wpf?

¿Cómo puedo asignar las imágenes a colocar a la izquierda de la etiqueta programáticamente en el código y no usar el código XAML.

Respuesta

2

Puesto que usted quiere esto en código detrás y no dentro de XAML que sugeriría abandonando el Label y usando un StackPanel junto con un ImageTextBlock y como se verá más adelante, donde MyGrid podría ser cualquier recipiente ...

 <Grid Name="MyGrid"/> 

... luego en su código detrás ...

 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 answer !! – CharlieShi

4

Puede grupo esto dentro de una cuadrícula:

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

O, puesto que la etiqueta es un control de contenido, sólo tiene que poner el control de la imagen dentro de un control de etiqueta:

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

vez usted sabe cómo debería verse el xaml, es muy fácil crear los mismos elementos a través del código.

+2

Su segundo ejemplo no funciona. ContentControl solo puede tener un hijo, y le está dando dos (la Imagen y el texto). Debería envolver un StackPanel a su alrededor, p. '' –

+0

Tiene razón, no debe pensar con claridad cuando escribí eso. –

+0

@Joe: Tu código tampoco funciona: no se puede agregar un valor de tipo 'String' a una colección o diccionario del tipo 'UIElementCollection' – Casebash

1

No estoy de acuerdo con las otras dos respuestas aquí. No es necesario agregar una cuadrícula para envolver el contenido. El stackpanel es suficiente.

En el xaml, agregue un panel de pila donde necesita que esté el contenido.

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

Luego, en el código subyacente, como en un controlador de botón o cuando la cantidad ventana Agregar este

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 

Puede cambiar la ubicación de la imagen y el texto añadiendo el texto primero y luego el imagen.

Si no ve la imagen, asegúrese de que la acción de creación de la imagen esté configurada como recurso en la ventana de propiedades de la imagen.

Para que el código sea más útil o más dinámico, necesitaría una forma de cambiar el texto o la imagen.

lo que permite decir que querían cambiar esos y de seguir adelante y hacer un

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

se esperaría que el texto sea cambiado pero lo que pasa?

Object reference not set to an instance of an object. 

Drats pero le di un nombre. Debería agregar

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

Para que pueda acceder al bloque de texto más tarde. Esto es necesario porque usted agregó el control al marco después de que fue construido y mostrado.Así que el código final se ve así después de registrar la imagen también

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