2010-04-29 2 views
6

여러 줄의 텍스트가있는 항목을 추가하면 사용자 지정 목록 상자 아래에 많은 공간이 생깁니다. 이 문제를 해결하려면 어떻게해야합니까?WPF ListBox의 아래에있는 여분의 공간 제거

alt text http://i39.tinypic.com/2ut6e6x.png

내 코드

<!-- List Item Hover --> 
<LinearGradientBrush x:Key="MouseOverFocusStyle" StartPoint="0,0" EndPoint="0,1"> 
    <LinearGradientBrush.GradientStops> 
     <GradientStop Color="#FF013B73" Offset="0.501"/> 
     <GradientStop Color="#FF091F34"/> 
     <GradientStop Color="#FF014A8F" Offset="0.5"/> 
     <GradientStop Color="#FF003363" Offset="1"/> 
    </LinearGradientBrush.GradientStops> 
</LinearGradientBrush> 

<!-- List Item Selected --> 
<LinearGradientBrush x:Key="LostFocusStyle" EndPoint="0.5,1" StartPoint="0.5,0"> 
    <LinearGradientBrush.RelativeTransform> 
     <TransformGroup> 
      <ScaleTransform CenterX="0.5" CenterY="0.5"/> 
      <SkewTransform CenterX="0.5" CenterY="0.5"/> 
      <RotateTransform CenterX="0.5" CenterY="0.5"/> 
      <TranslateTransform/> 
     </TransformGroup> 
    </LinearGradientBrush.RelativeTransform> 
    <GradientStop Color="#FF091F34" Offset="1"/> 
    <GradientStop Color="#FF002F5C" Offset="0.4"/> 
</LinearGradientBrush> 

<!-- List Item Highlight --> 
<SolidColorBrush x:Key="ListItemHighlight" Color="#FFE38E27" /> 

<!-- List Item UnHighlight --> 
<SolidColorBrush x:Key="ListItemUnHighlight" Color="#FF6FB8FD" /> 

<Style TargetType="ListBoxItem"> 
    <EventSetter Event="GotFocus" Handler="ListItem_GotFocus"></EventSetter> 
    <EventSetter Event="LostFocus" Handler="ListItem_LostFocus"></EventSetter> 
</Style> 

<DataTemplate x:Key="CustomListData" DataType="{x:Type ListBoxItem}"> 
    <Border BorderBrush="Black" BorderThickness="1" Margin="-2,0,0,-1"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=ActualWidth}" /> 
      </Grid.ColumnDefinitions> 
      <Label 
        VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent" 
        Foreground="{StaticResource ListItemUnHighlight}" 
        FontSize="24" 
        Tag="{Binding .}" 
        Grid.Column="0" 
        MinHeight="55" 
        Cursor="Hand" 
        FontFamily="Arial" 
        FocusVisualStyle="{x:Null}" 
        KeyboardNavigation.TabNavigation="None" 
        Background="{StaticResource LostFocusStyle}" 
        MouseMove="ListItem_MouseOver" 
        > 
       <Label.ContextMenu> 
        <ContextMenu Name="editMenu"> 
         <MenuItem Header="Edit"/> 
        </ContextMenu> 
       </Label.ContextMenu> 
       <TextBlock Text="{Binding .}" Margin="15,0,40,0" TextWrapping="Wrap"></TextBlock> 
      </Label> 
      <Image 
       Tag="{Binding .}" 
       Source="{Binding}" 
       Margin="260,0,0,0" 
       Grid.Column="1" 
       Stretch="None" 
       Width="16" 
       Height="22" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       /> 
     </Grid> 
    </Border> 
</DataTemplate> 

</Window.Resources> 

<Window.DataContext> 
<ObjectDataProvider ObjectType="{x:Type local:ImageLoader}" MethodName="LoadImages" /> 
</Window.DataContext> 


<ListBox ItemsSource="{Binding}" Width="320" Background="#FF021422" BorderBrush="#FF1C4B79" > 

<ListBox.Resources> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}">Transparent</SolidColorBrush> 

    <Style TargetType="{x:Type ListBox}"> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> 
     <Setter Property="ItemTemplate" Value="{StaticResource CustomListData }" /> 
    </Style> 

</ListBox.Resources> 

코드 숨김

public static class ImageLoader 
{ 
    public static List<String> LoadImages() 
    { 
     List<String> images = new List<String>(); 
     for (int x = 0; x < 10; x++) 
     { 
      if (x == 5) 
      { 
       images.Add("Test Test Test Test Test Test Test Test Test TestTest Test Test Test Test Test Test Test Test Test Test Test Test Test Test Test" + x); 
      } 
      else 
      { 
       images.Add("Test " + x); 
      } 
     } 
     return images; 
    } 
} 

답변

11

현재 항목을 스크롤하고 있습니다.

문제는 목록 상자의 테스트 5가 표시 될 다음 항목 (포함 된 그림에 표시된 빈 공간보다 큽니다) 때문입니다. Test 5가 완전히 표시되도록 공간이 커지면 실제로 표시됩니다.

그러나 항목 별 스크롤 대신 부드러운 스크롤을 원할 경우 ScrollViewer.CanContentScroll 속성을 false로 설정하기 만하면됩니다.

<ListBox ScrollViewer.CanContentScroll="False" ItemsSource="{Binding}" Width="320" Background="#FF021422" BorderBrush="#FF1C4B79" > 

희망 하시겠습니까? 신속한 답변으로

+1

내 스크롤 막대 크기가 변경되고 하단에 공백이 생기는 문제가 해결되었습니다. 설명에 감사드립니다. – Ryan

+0

이렇게하면 UI 가상화가 비활성화됩니다. –

+0

@Stephen Drew - 항목 크기가 다른 높이로되어 있고 스크롤바에서 적절한 표현을 얻으려고 가상화를 사용하지 않도록 설정 한 이유는 그들이 왜 그런 식으로 설계했는지 이해하는 것입니다. 그러나 이것은 거의 4 년간의 답변입니다 전, 그리고 난 거기에 몇 가지 더 많은 옵션이 있습니다. NET 4.5 : http://stackoverflow.com/questions/1977929/wpf-listbox-with-a-listbox-ui-virtualization-and-scrolling – Scott

관련 문제