2017-01-16 1 views
1

나는 아주 간단한 채팅 프로그램을 만들고있다. (주로 WPF를 가르치기 위해) ListBox를 만들려고하는데, 여기에는 채팅 히스토리를 나타내는 문자열이 맨 아래에 표시되고 목록 상자 안에 텍스트가 표시된다. 랩. 이 두 가지 문제에 대해 각각 몇 가지 해결책을 별도로 보았지만 ListBox.ItemsPanel을 설정해야합니다. 한 번만 할 수 있습니다. WPF에서는 아직 익숙하지 않기 때문에 실제로이 두 가지 기능을 함께 사용하는 방법을 알지 못합니다. VirtualizingStackPanel에이 일을 간단하게 설정할 수있는 속성이 있습니까? 이 작업을 수행하려면 데이터 템플릿을 만들어야합니까?ListBox를 Word Wrapping에서 Display Bottom to Top으로 설정하려면 어떻게해야합니까?

실제로 ListBox의 내용이 아래쪽에서 위쪽으로 이동하는 내 XAML입니다.

<ListBox x:Name="lbChatHistory" ItemsSource="{Binding History}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel VerticalAlignment="Bottom" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

답변

1

당신은 각 항목에 사용할 ListBox에 대한 ItemTemplate을 지정해야합니다. 그런 다음 해당 템플릿 내에서 TextBlock 속성이 있고 TextWrapping 속성이 Wrap으로 설정되어 있어야합니다.

그러나 실제 해결해야 할 문제는 처음에 TextBlock을 그릴 때 필요한 공간으로 확장되는 상황에 빠지게된다는 것입니다. 그러나 그 후에는 크기가 조정되지 않습니다.

크기를 조정할 수있는 부모에게 바인딩하면 (모든 항목이 자동으로 크기가 조정되지는 않는다는 점에 유의하십시오.)) 그런 변경을 할 수 있습니다.

디자인 단계에서 내가 좋아하는 한 가지는 항목의 스타일을 지정하여 스타일을 결정하는 것입니다. 이 예를 들어

<Grid Background="DarkGreen"> 
    <ListBox x:Name="lbChatHistory" 
      ItemsSource="{StaticResource Orders}" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      Background="DarkBlue" 
      Margin="10"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel VerticalAlignment="Bottom" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding CustomerName, FallbackValue=Unknown}" 
          FontSize="14" 
          Foreground="White" 
          TextWrapping="Wrap" 
          Width="{Binding ElementName=lbChatHistory, Path=ActualWidth}" 
          VerticalAlignment="Stretch" 
          HorizontalAlignment="Stretch" 
          Background="DarkRed"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

enter image description here

코드는 컨트롤이 확실한 특성을 가진 Orders의 목록에 바인딩 완전성, 그러나 당신의 데이터는 물론 다릅니다.

<Page.Resources> 
    <model:Orders x:Key="Orders"> 
     <model:Order CustomerName="Alpha" 
         OrderId="997" 
         InProgress="True" /> 
     <model:Order CustomerName="Beta" 
         OrderId="998" 
         InProgress="False" /> 
     <model:Order CustomerName="Omega" 
         OrderId="999" 
         InProgress="True" /> 
     <model:Order CustomerName="The rain in spain falls mainly" 
         OrderId="1000" 
         InProgress="False" /> 
    </model:Orders> 
</Page.Resources> 

난 당신이 주변 TextBlock의 색상으로 당신의 다음 질문이 필요할 수있다 ListBoxItem HorizontalContentAlignment To Stretch Across Full Width of ListBox 준 대답에 원격으로 유사한이 답변.

+0

이 응답을 보내 주셔서 감사합니다. DataBinding에 대한 다소 새로운 지식으로 인해 한 가지 문제가 있습니다. 제공된 제안 된 ListBox.ItemTemplate을 추가하면 ListBox의 출력이 "Unknown"의 Fallback 값이됩니다. ListBox 자체의 ItemSource 바인딩은 History라는 ObservableCollection이라는 문자열을 가리 킵니다. 그래서 TextBlock 자체의 바인딩을 다른 것으로 변경해야합니까? 내 유일한 추측은 그게 의미가있는 경우 "역사"내에서 "역사"를 찾을 수 없기 때문에 그것이 혼란 스럽다는 것입니다 ... – WannabeCoder

+0

사실, 나는 이것을 알아 냈습니다. 'Text = "{Binding}" '일했다. 내가하는 일이 무엇인지 잘 모르겠다. 그래서 내가보기 엔 새로운 것이지만, 효과가 있었다. – WannabeCoder

+0

@WannabeCoder 바인딩은 바인딩 할 속성이없는 문자열 목록입니다. "바인딩"이라고 말하면 파서에게 현재 제공되는 속성 이름없이'DataContext'를 반영하도록 알려줍니다. 데이터를 얻으려면.예를 들어, 앞으로 타임 스탬프, 글꼴 정보 등의 속성을 가진 실제 인스턴스 객체가있는 곳에서는 속성 이름을 추가해야합니다. 이 목록을 작성하고 바인딩뿐만 아니라 크기 조정 문제를 처리하는 방법을 보여주는 사람이므로 내 게시물을 답으로 표시해주십시오. 고마워 – OmegaMan

관련 문제