2017-07-11 16 views
0

WPFのリストボックスとスタックパネルのコントロールに関するすべてを読んだ後、この動作の原因は何となく分かりません。私はリストボックスの上のアイテムを積み重ねて、大量のスペースを必要としないようにしたいと思いますが、私が何をしても、それぞれの間に大きなギャップがあるようです。 VerticalContentAlignment = "Top"プロパティをリストボックスに含めて、スタックパネルの縦方向のアライメントを設定して、デフォルトのストレッチを持たないようにしました。ここでは、コードは次のようになります。WPFがリストボックスの垂直方向の配置が正しく動作しない

<Grid> 

     <ListBox x:Name="listView" HorizontalAlignment="Stretch" SelectionMode="Multiple" IsHitTestVisible="True" VerticalContentAlignment="Top"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid Columns="1"/> 
       </ItemsPanelTemplate> 

      </ItemsControl.ItemsPanel> 

      <ListBox.ItemContainerStyle> 
       <Style TargetType="ListBoxItem"> 
        <Setter Property="IsSelected" Value="{Binding Content.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource Self}}"/> 
        <Setter Property="VerticalContentAlignment" Value="Top"/> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="ListBoxItem"> 
           <ContentPresenter/> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </ListBox.ItemContainerStyle> 


      <ListBox.ItemTemplate> 

       <DataTemplate> 

        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Margin="0,0,0,10" VerticalAlignment="Top" Background="Black"> 
         <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected}" BorderBrush="#FF242424" VerticalAlignment="Center"> 
          <CheckBox.LayoutTransform> 
           <ScaleTransform ScaleX="4" ScaleY="4" /> 
          </CheckBox.LayoutTransform> 
         </CheckBox>      
         <Image Source="{Binding Image}" HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="None" /> 
         <StackPanel Orientation="Vertical" VerticalAlignment="Top"> 
          <TextBlock Text="{Binding Test1}" FontSize="22" Margin="5,0,0,3" FontWeight="UltraLight"></TextBlock> 
          <TextBlock Text="{Binding Test2}" FontSize="11" Foreground="#FF585656" Margin="5,0,0,3" FontWeight="UltraLight"/> 
          <TextBlock Text="{Binding Test3}" FontSize="11" Foreground="#FF585656" Margin="5,0,0,0" FontWeight="UltraLight"/> 
         </StackPanel> 

        </StackPanel> 

       </DataTemplate> 


      </ListBox.ItemTemplate> 

     </ListBox> 
    </Grid> 

そして、ここではその結果です:

enter image description here

私はそれが利用可能にストレッチされていないことを確認するために、トラブルシューティングの目的のためにスタックパネル項目に黒い背景を追加しました高さ。

私が何をしても、最初のリスト項目は正しく配置されているように見えますが、すべての連続する項目間に大きなギャップがあります。何か案は?

+1

UniformGridは、空間を子供の間で均等に分割します。 'ItemContainerStyle'に' Background'セッターを追加すると、ListBoxItemsがすべての空白を占めていることがわかります。 'VerticalContentAlignment'が' Stretch'の場合、項目の内容はListBoxItemsを埋めるように伸びます。実際には、StackPanel VerticalAlignmentも伸ばしなければならないと思います。項目を上から塗りつぶす場合は、ItemPanelTemplateに垂直方向のStackPanelを使用します。これがデフォルトですので、 'ItemPanelTemplate'を削除することができます。 –

+1

@Ed Plunkett Ugh ...だから簡単です...単にItemPanelTemplateを削除するだけでした。私は十分にあなたに感謝することはできません。 –

答えて

1

ItemsPanelTemplateUniformGridは、利用可能なスペースを子供の間で均等に分割します。 ItemContainerStyleに背景セッターを追加すると、ListBoxItemsがその空白をすべて占めていることがわかります。彼らのコンテンツは一番上に並んでいますが、彼ら自身が彼らの親である "細胞"を埋めるために垂直に引き伸ばされています。UniformGridはそれらを与えます。

あなたListBoxItem.VerticalContentAlignmentDataTemplateStackPanelVerticalAlignmentとともに、Stretchた場合は、アイテムの内容はListBoxItemsを埋めるためにストレッチです。しかし、それはあなたが望むものではありません。

あなたのItemPanelTemplateに垂直方向のStackPanelを使用して、上部から項目を塗りつぶすことができます。それはListBoxがそれ自身のために作成するデフォルトなので、ItemPanelTemplateを削除すればそれが得られます。

関連する問題