2017-01-16 1 views
1

私は非常に簡単なチャットプログラムを作成しています(主に自分自身にWPFを教えるために)、ListBoxの要素(チャット履歴を表す文字列)が下から上に、リストボックス内のテキストが表示されるようにしようとしていますラップします。私はこれらの問題の両方のためのいくつかのソリューションを別々に見てきましたが、ListBox.ItemsPanelを設定する必要がありますが、これは一度しかできません。私はまだWPFにはまだ初心者であるため、これらの両方の機能を実際に連携させるための機能を実際にどのように実現するかについてはわかりません。これを行うために単純に設定できるVirtualizingStackPanelのプロパティはありますか?これを達成するためにデータテンプレートを作成する必要がありますか?ListBoxをWord WrappingでDisplay Bottom to Topに設定するにはどうすればよいですか?

私のXAMLはListBoxのコンテンツを実際に下から上へと持っています。

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

答えて

1

あなたは、各項目に使用するListBoxためItemTemplateを指定する必要があります。そのテンプレートの中でTextBlockという属性を持つ必要があります。TextWrappingの属性はWrapに設定されています。

実際に、以下で解決する問題は、最初に描画されたときにTextBlockが必要な領域に拡張されるという状況に遭遇することです。しかし、それ以降はサイズが変更されません。

サイズ変更可能な親にバインドすることによって()、すべてのものが自動的にサイズ変更されないことに注意してください。)このような変更を行うことができます。

私が設計段階で好きなことの1つは、アイテムのスタイルを特定の色にして物事を描く方法を決定することです。この例では

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

私はあなたが周囲のテキストブロックを色としてあなたの次の質問のために必要とされるListBoxItem HorizontalContentAlignment To Stretch Across Full Width of ListBoxを与えた答えをリモート似たこの答え。

+0

ありがとうございます。私は1つの問題にぶつかっています。これは、データバインディングに関する私のやや新しい知識に由来しています。あなたが提供した提案されたListBox.ItemTemplateを追加すると、リストボックスの出力は "不明"のフォールバック値になります。 ListBox自体のItemSource Bindingは、Historyと呼ばれるObservableCollection of Stringsを指します。ですから、TextBlock自体のバインディングを別のものに変更する必要はありませんか?私の唯一の推測は、「歴史」の中で「歴史」を見つけることができないので、それが混乱しているということです。 – WannabeCoder

+0

実際に、私はちょうどそれを考え出しました... 'Text =" {Binding} " '働いた。それが何をしているのか分かりませんので、私に見てもらうために何か新しいことがありますが、うまくいきました。 – WannabeCoder

+0

@WannabeCoderバインディングは、バインドするプロパティがない文字列のリスト用です。 "バインディング"と言うだけで、パーサーには現在の 'DataContext'を反映させ、プロパティ名は指定しません。データを取得します。私の例では、将来、タイムスタンプ、フォント情報などのプロパティを持つ実際のインスタンスオブジェクトがある場所では、プロパティ名を追加する必要があります。このリストを作成し、サイズ変更の問題とバインディングを処理する方法を誰かに示すので、私の投稿に答えとしてマークしてください。どうも – OmegaMan

関連する問題