2011-01-03 42 views
5

Tôi hiện đang phát triển một ứng dụng trong C# bằng cách sử dụng WPF. Những gì tôi cần để có thể làm là trên một nhãn làm cho họ là một hình ảnh bên trái của văn bản của nhãn một hình ảnh nhỏ của một X hoặc một hình ảnh nhỏ của một đánh dấu tùy thuộc vào hoàn cảnh. Tôi đã có những hình ảnh được bao gồm trong dự án trong một thư mục có tên hình ảnh.thêm hình ảnh vào nhãn trong wpf?

Làm cách nào tôi có thể gán hình ảnh được đặt ở bên trái nhãn có lập trình trong mã và không sử dụng mã XAML.

Trả lời

2

Vì bạn muốn điều này trong mã phía sau và không nằm trong XAML tôi sẽ đề nghị đã bỏ rơi các Label và sử dụng một StackPanel kết hợp với một ImageTextBlock như bên dưới nơi MyGrid thể là bất kỳ container ...

 <Grid Name="MyGrid"/> 

... sau đó trong mã của bạn đằng sau ...

 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

Câu trả lời tuyệt vời !! – CharlieShi

4

Bạn có thể nhóm này bên trong một mạng lưới:

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

Hoặc, vì nhãn là một điều khiển nội dung, bạn chỉ có thể đặt sự kiểm soát hình ảnh bên trong một điều khiển nhãn:

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

Khi bạn biết làm thế nào xaml sẽ như thế nào, nó rất dễ dàng để tạo ra các yếu tố tương tự thông qua mã.

+2

Ví dụ thứ hai của bạn không hoạt động. ContentControl chỉ có thể có một đứa trẻ, và bạn đang cho nó hai (Hình ảnh và văn bản). Bạn sẽ cần phải quấn một StackPanel xung quanh, ví dụ: '' –

+0

Bạn nói đúng, không được nghĩ thẳng khi tôi viết cái đó. –

+0

@Joe: Mã của bạn không hoạt động - Không thể thêm giá trị loại 'Chuỗi' vào bộ sưu tập hoặc từ điển thuộc loại 'UIElementCollection' – Casebash

1

Tôi không đồng ý với hai câu trả lời khác tại đây. Không cần phải thêm lưới để bọc nội dung. Stackpanel là đủ.

Trong xaml, hãy thêm chồng xếp chồng vào nơi bạn cần nội dung.

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

Sau đó, trong đoạn code phía sau, giống như trong một handler nút hoặc khi tải cửa sổ thêm này

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 

Bạn có thể trao đổi vị trí của hình ảnh và văn bản bằng cách thêm văn bản đầu tiên thì hình ảnh.

Nếu bạn không thấy hình ảnh, đảm bảo hành động xây dựng của hình ảnh được đặt thành tài nguyên trong cửa sổ thuộc tính của hình ảnh.

Để mã hữu ích hơn hoặc động hơn, bạn cần có cách thay đổi văn bản hoặc hình ảnh.

Vì vậy, cho phép nói rằng bạn đã muốn thay đổi những và bạn đi trước và làm một

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

Bạn mong chờ văn bản phải được thay đổi nhưng những gì sẽ xảy ra?

Object reference not set to an instance of an object. 

Drats nhưng tôi đã đặt tên cho nó. Bạn cần phải thêm

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

Để bạn có thể truy cập vào trình soạn thảo sau này. Điều này là cần thiết vì bạn đã thêm điều khiển vào khung sau khi nó được xây dựng và hiển thị.Vì vậy, mã cuối cùng trông giống như sau khi đăng ký hình ảnh quá

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); 
Các vấn đề liên quan