2016-12-12 9 views
2

各アイテムがTextBoxを印刷するItemsControlで構成されるListBoxを持っています。WPF水平に積み重ねられたTextLimming TextBlocksを使用したItemsControl

<Window.Resources> 
    <DataTemplate x:Key="ItemTemplate"> 
     <Grid Margin="0,0,0,0"> 
      <ItemsControl 
       ItemsSource="{Binding Collection2}" 
       ItemTemplate="{DynamicResource SubItemTemplate}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"></StackPanel> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </Grid> 
    </DataTemplate> 
</Window.Resources> 

<Grid ShowGridLines="True" DataContext="{Binding Source={StaticResource SampleDataSource}}"> 
    <ListBox x:Name="listBox" 
      HorizontalAlignment="Left" 
      Width="280" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      ItemTemplate="{DynamicResource ItemTemplate}" 
      ItemsSource="{Binding Collection1}"/> 
</Grid> 

のItemsControlリストがカットオフされますabrubtly私は、リストボックスで無効になっHorizo​​ntalScrollBarVsibilityを持っているので。今、TextBoxes TextTrimmingプロパティを使用して、リストの最後にドットを残して、テキストがカットオフされ、グリッドの後ろに隠れるようにします。私は何も結果なしで、次のItemTemplateにを使用してこれを実行しよう

enter image description here

:下の図の赤い点として示さ

<DataTemplate x:Key="SubItemTemplate"> 
    <Border BorderThickness="1" BorderBrush="Black"> 
     <TextBlock Margin="5, 0, 5, 0" 
       TextTrimming="CharacterEllipsis" 
       Text="{Binding Name}"> 
     </TextBlock> 
    </Border> 
</DataTemplate> 

私の質問は:どのように私はTextTrimmingの機能を実現することができます上記の図のように水平に積み重ねられたリスト?

私は次のような構造でVisual Studioのブレンドを使用してサンプルデータを使用しました:

  • SampleDataSource(データコンテキスト)
    • Collection1:(コレクション)
      • コレクション2:(コレクション)
        • 名前:(文字列)

を更新2016年12月13日
は、私は、外部スタイルとしてtexttrimmingを設定しようと、私は提案のようなボーダー、TextBlockのとのStackPanel(両方でMaxWidthの設定しようとしましたコメントで)。それ以外にも、私はTextBlock内のItemsControl全体をラップし、その上にTextTrimmingプロパティを配置しようとしました。これのどれも不幸にも結果をもたらしませんでした。私は基本的にこれは、O iが提供するコード例を簡素化したいんすべてのことが関連している:(赤い点は私が達成したいものを可視化されている)、このようになります

<Grid> 
    <StackPanel Width="150" Orientation="Horizontal"> 
     <TextBlock TextTrimming="CharacterEllipsis" Text="This is textbox1"/> 
     <TextBlock TextTrimming="CharacterEllipsis" Text="This is textbox2"/> 
    </StackPanel> 
</Grid> 

enter image description here

ここでは、2つのテキストブロックをマージし、代わりに「実行」を使用することができますが、これは私の「本当の」問題には当てはまりません。

アップデート2017年2月24日

この溶液を(余分なスペースとマージンに注意してください)コメントで提案されました:

次を生成
<Window.Resources> 

    <Style x:Key="TextStyle" TargetType="TextBlock"> 
     <Setter Property="TextTrimming" Value="CharacterEllipsis"/> 
     <Setter Property="Margin" Value="0, 0, -1, 0"/> 
    </Style> 
</Window.Resources> 
<Grid> 
    <DockPanel> 
     <TextBlock Style="{StaticResource TextStyle}" Text="This is textbox1 "/> 
     <TextBlock Style="{StaticResource TextStyle}" Text="This is textbox2 "/> 
     <TextBlock Style="{StaticResource TextStyle}" Text="This is textbox3 "/> 
    </DockPanel> 
</Grid> 

enter image description here

また、余白にはさまざまな量のスペースと異なる値を試しました必要な結果のないテキストブロック。だから正解は私の問題を完全には解決しません。

+0

外部のスタイルを試しましたか?次のように考えてみましょう: 'Window.Resource> Text Trimming Properties>' 'TextTlockate = "/>' DataTemplateがVisualTreeの一部ではないことから、あなたが適用したスタイルは評価されません。それがどうなるか教えてください。 – XAMlMAX

+0

'ItemsPanelTemplate'を次のように置き換えてみてください:' トリミングを呼び出すためのパネル境界を提供していないだけですが、今はテストする時間がありません。 :) –

+0

@ XAMlMAX Chris Wあなたのコメントをありがとう、残念ながらそれは動作しませんでした。あなたが喜んでいるなら私の更新を見てください。 – micnil

答えて

1

DockPanelに変更してください。 StackPanelの最大幅を設定しても、その内部のコンテンツは障壁がないかのように動作します。 A DockPanelがバリアを強制し、アイテムが水平なので、他の変更は必要ありません。

+0

これは実際に動作するように見えます。私はObservableCollectionにバインドし、アイテムからRun要素を作成する、派生したカスタムテキストボックスを作成しようと一日中努力しました。このすべての私は複数の代わりに単一のテキストボックスを使用することができます。明日あなたのソリューションを試してみましょう。 – micnil

+1

私はこの解決策を以前に見つけることができなかったことに驚くべきことでした。ただし、注意点が1つあります。親コントロールが2つのTextBlockの間を正確に切断するようにサイズを変更すると、省略記号はまったく表示されません。また、TextBlockの先頭だけを切り取っても、最初の1つまたは2つの楕円だけが表示されます。私は、親コントロールがどこの名前のリストを切り捨てるかにかかわらず、省略記号を常に表示するソリューションが必要だと思います。このために私のカスタムテキストボックスに行く。私はこれを正解としていますが、それは私の質問に最善の答えを与えるからです。 – micnil

+0

@micnil、私はこれが古い投稿だと知っていますが、私があなたが言及した警告を修正する方法を考え出したかもしれないと思います。テキストボックスのテキストの最後にスペースを追加し、右側に1の余白を追加すると、私はこれが問題を防ぐだろうと思う。これをテストしたことに注意してください。 – Bryan

関連する問題