문제
간단한 채팅 응용 프로그램을 작업 중입니다. 현재 메시지는 이와 같은 사용자 정의 스타일의 목록 상자 (단순화 된 XAML)에 묶여 있습니다.
<ListBox ItemsSource="{Binding MessageCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
이제 이미지 (그래픽 스마일)를 표시된 메시지 텍스트에 넣을 수 있습니다. TextBlock (또는 다른 standart 구성 요소)을 사용하여이를 달성 할 수있는 방법이 있습니까? 아니면이를 위해 특별한 컨트롤을 사용해야합니까?
미리 감사드립니다
해결책
실제로 이미지를 원한다면 내부에 텍스트 (이모티콘과 같은), 당신은 일을해야 할 것입니다. 이것은 실제로 사용자 컨트롤을 원할 몇 번 중 하나 인 것 같습니다. 그 점은 이모티콘 값을 찾고 데이터 템플릿을 즉시 구축하는 텍스트를 스캔하는 것입니다.
XAML에서 할 수있는 일은 코드에서 할 수있는 모든 것을 기억하십시오. 그래서 내가 생각하고있는 코드는이 일반적인 아이디어를 따를 것입니다.
- 이모티콘 값에 대한 텍스트를 스캔하고 데이터 요소에 대한 값 목록을 만듭니다.
- DockPanel을 만듭니다.
- 목록의 foreach 요소, 텍스트 블록 또는 이미지를 추가하십시오 (값 기준).
- 이를 도크 패널에 설정하십시오.
나는 이와 같은 것이 실제로 당신이 찾고있는 것이라고 생각하지만, 이미지 만 원한다면 ValueConverter 제안이 작동합니다.
다른 팁
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>
TextBlock의 내용은 항상 일련의 인라인 일 뿐이므로 InlineUicontainer를 사용해야합니다. 이 컨테이너를 텍스트 블록에서 이미지가 나타나기를 원하는 곳에서 텍스트 실행과 번갈아 가면서 텍스트 블록의 인라인 중 하나로 삽입 할 수 있습니다. 메시지를 구문 분석 할 수 있으며 동시에 텍스트 블록의 인라인 모음에 찾은 토큰 (텍스트 또는 이미지)을 계속 추가하십시오.
값 변환기를 사용하여 텍스트를 다른 유형으로 변환 할 수있는 텍스트 또는 스마일면으로 구성된 세그먼트 목록이있는 다른 유형으로 변환 할 수 있습니다 (나타나는 순서대로).
그런 다음 데이터 템플릿을 사용하여 해당 새 유형에 바인딩하고 텍스트와 스마일면을 적절하게 표시 할 수 있습니다.
나는 또한 최근 에이 문제를 겪었고 이것을 극복합니다.
itemspaneltemplate에 Wrappanel이있는 Itemscontrol이 포함 된 Listbox 항목 회화를 작성한 다음 내 문자열을 모든 논리를 수용하는 IvalueConverter와 함께 Itemscontrol의 항목 소스에 바인딩합니다.
단어와 쿼리/쿼리/이모티콘 문자열, 하이퍼 링크 등을 검색하고 텍스트 블록, 이미지, 하이퍼 링크, 버튼 요소를 만들고 값과 이벤트 핸들을 설정하십시오.
함수에서 목록을 만듭니다u003CUIElement> 생성 한 컨트롤로 목록을 채우고 IvalueConverter의 변환 함수의 개체로 목록을 반환합니다.
당신은 거기에 Wrappanel이 있기 때문에 포장을 완료합니다.
텍스트 블록 대신 이미지 요소를 사용하고 변환기를 사용하여 텍스트 값을 스마일 이미지에 매핑하십시오.
<ListBox ItemsSource="{Binding MessageCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Text, Converter={StaticResource MyImageConverter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>