2009-04-07 75 views
9

Tôi đang làm việc trên một ứng dụng trò chuyện đơn giản. Hiện nay các thông điệp được binded đến một ListBox tùy chỉnh theo kiểu như thế này (XAML giản thể):Hiển thị hình ảnh trong TextBlock (WPF)

<ListBox ItemsSource="{Binding MessageCollection}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Bây giờ tôi muốn để có thể đưa hình ảnh (như mặt cười đồ họa) vào tin nhắn văn bản được hiển thị. Có cách nào để đạt được điều này bằng cách sử dụng TextBlock (hoặc bất kỳ thành phần standart khác) hoặc tôi cần phải sử dụng một số kiểm soát đặc biệt cho điều này?

Cảm ơn trước

Trả lời

1

Nếu bạn muốn hình ảnh thực sự bên văn bản (như một biểu tượng cảm xúc), sau đó bạn sẽ phải làm một số công việc. Điều này nghe có vẻ như một trong vài lần tôi thực sự muốn có một điều khiển người dùng, điểm mà trong đó sẽ là một trong đó quét các văn bản tìm kiếm các giá trị biểu tượng cảm xúc và xây dựng một mẫu dữ liệu trên bay.

Hãy nhớ rằng bất cứ điều gì bạn có thể làm trong XAML bạn có thể làm trong mã, do đó mã Tôi đang nghĩ đến việc sẽ làm theo ý kiến ​​chung này:

  1. văn bản Scan cho các giá trị biểu tượng cảm xúc và tạo ra một danh sách các giá trị cho dữ liệu yếu tố.
  2. Tạo DockPanel.
  3. Phần tử bỏ qua trong Danh sách, thêm hoặc một TextBlock hoặc Hình ảnh (dựa trên giá trị).
  4. Đặt điều này.Content to the DockPanel.

Tôi nghĩ rằng một cái gì đó như thế này thực sự là những gì bạn đang tìm kiếm, nhưng nếu bạn muốn chỉ một hình ảnh, thì đề xuất ValueConverter sẽ hoạt động.

+0

Tôi thích video này, âm thanh khá đơn giản. Nhưng tôi lo lắng về việc textwrapping ... Tôi sẽ cố gắng thực hiện nó và xem nó hoạt động như thế nào. Cảm ơn. – lacop

+0

Đó là một điểm tốt. Bạn có thể cần phải làm một số đo lường và phá vỡ các văn bản lên khi cần thiết để có được hiệu ứng gói chính xác. Nó chỉ nên là một vấn đề khi một biểu tượng cảm xúc có mặt. –

+0

Dù sao, tôi dường như không thể tìm cách để làm điều này. Tôi đã tạo điều khiển người dùng tùy chỉnh nhưng tôi không biết cách ghi đè cơ chế hiển thị và thay thế bằng mã của tôi khi phát ra các phần tử TextBox/Image theo yêu cầu. Bạn có thể cho tôi một gợi ý xin vui lòng? – lacop

1

Bạn có thể sử dụng một bộ chuyển đổi giá trị để chuyển đổi văn bản sang một loại trong đó có một danh sách các phân đoạn có cấu tạo từ một trong hai văn bản hoặc các hình mặt cười (theo thứ tự mà chúng xuất hiện).

Sau đó, bạn có thể sử dụng mẫu dữ liệu để liên kết với loại mới đó và hiển thị văn bản và mặt cười phù hợp.

+0

Bạn có thể giải thích phần thứ hai nhiều hơn một chút (hoặc chỉ liên kết tôi với tài liệu/mẫu). Tôi nghĩ rằng tôi hiểu phần đầu tiên nhưng không biết cách ánh xạ hai loại dữ liệu khác nhau cho các phần tử khác nhau. – lacop

-1

Sử dụng phần tử Hình ảnh thay vì TextBlock và sử dụng Trình chuyển đổi để ánh xạ giá trị văn bản thành hình ảnh nụ cười.

<ListBox ItemsSource="{Binding MessageCollection}"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Image Source="{Binding Text, Converter={StaticResource MyImageConverter}}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

+0

Nhưng điều này sẽ chỉ cho phép một hình ảnh trong tin nhắn, phải không? Những gì tôi muốn là sự kết hợp của văn bản và hình ảnh trong một tin nhắn. – lacop

+0

DataTemplace có thể là mọi thứ bạn muốn. Ví dụ <... điều khiển khác ...> ema

3

Nội dung của TextBlock luôn là một chuỗi Nội tuyến, vì vậy bạn nên sử dụng InlineUIContainer. Bạn có thể chèn vùng chứa này làm một trong các dòng Inline trong TextBlock của mình bất cứ nơi nào bạn muốn một hình ảnh xuất hiện, xen kẽ với văn bản Chạy. Bạn có thể phân tích cú pháp thư và đồng thời tiếp tục thêm mã thông báo (văn bản hoặc hình ảnh) mà bạn tìm thấy vào bộ sưu tập Inlines của TextBlock.

31

Chỉ cần sử dụng InlineUIContainer.

<TextBlock TextWrapping="Wrap"> 
    <Run>Some text.</Run> 
    <InlineUIContainer> 
     <Image Source="http://sstatic.net/stackoverflow/img/apple-touch-icon.png" Height="20"></Image> 
    </InlineUIContainer> 
    <Run>Some more text.</Run> 
</TextBlock> 
1

Tôi cũng gặp phải vấn đề này thời gian gần đây và tôi khắc phục điều này bằng cách

Tạo một ListBox ItemTemplate chứa một ItemsControl mà có một WrapPanel trong ItemsPanelTemplate và sau đó liên kết chuỗi của tôi để ItemsSource của ItemsControl với một IValueConverter chứa tất cả logic.

Tách ra các từ của bạn và truy vấn/tìm kiếm các biểu tượng cảm xúc, siêu liên kết vv và tạo TextBlock, hình ảnh, siêu liên kết, các yếu tố nút và đặt giá trị và xử lý sự kiện của bạn.

Trong hàm tạo danh sách < UIElement> và điền danh sách với các điều khiển bạn đã tạo và trả về danh sách dưới dạng đối tượng trong hàm chuyển đổi của IValueConverter.

Bởi vì bạn có WrapPanel trong đó bạn nhận được gói của bạn thực hiện.

Các vấn đề liên quan