在项目选择上收缩ListBox

时间:2010-01-03 02:43:34

标签: wpf listbox listboxitem

我有一个使用datatemplate的列表框。我需要的是选择项目之后的一种方式我想缩小列表框本身,而不是里面的列表项目。我已经在selector.selected和unselected上尝试了eventtrigger但它没有触发。我还在datatemplate上放了一个datatrigger,但我无法从这里访问列表框。任何想法?

2 个答案:

答案 0 :(得分:1)

这是一个稍微间接的解决方案,但是......您可以通过在ListBox本身上放置DataTrigger并绑定到SelectedItems.Count来处理此问题。您需要将ListBox默认为其“较小”外观。然后触发器将检查SelectedItems.Count是否为0,如果是,则必须使ListBox 更大。在下面的示例中,为了简单起见,我设置了ListBox.Background,但您应该能够调整它以在LayoutTransform或RenderTransform或Width / Height上操作,或者您用来“缩小”ListBox的任何内容:

<ListBox.Style>
  <Style TargetType="ListBox">
    <Style.Triggers>
      <DataTrigger Binding="{Binding SelectedItems.Count, RelativeSource={RelativeSource Self}}" Value="0">
        <Setter Property="Background" Value="Orange" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</ListBox.Style>

显然,当选择任何内容时,这将缩小(或者,在我的简化示例中,变为白色)整个ListBox。要使选定的ListBoxItem保持完整大小,请使用ListBox.ItemContainerStyle。在此,您可以触发IsSelected,并应用合适的setter来反转“收缩”转换 - 例如应用负边距或反向ScaleTransform。 (正常的触发器可以做到这一点。)

答案 1 :(得分:0)

首先,要挂钩的正确事件是SelectionChanged而不是Selected,其次,您可以在窗口级别使用Storyboard

Storyboard

<Storyboard x:Key="Storyboard1">
    <DoubleAnimationUsingKeyFrames 
        BeginTime="00:00:00" 
        Storyboard.TargetName="grid" 
        Storyboard.TargetProperty="(FrameworkElement.Height)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

窗口触发器:

<Window.Triggers>
    <EventTrigger RoutedEvent="Selector.SelectionChanged" SourceName="listBox">
        <BeginStoryboard Storyboard="{StaticResource Storyboard1}"/>
    </EventTrigger>
</Window.Triggers>

ListBox(有一些装饰效果):

<Border 
    BorderThickness="2" 
    CornerRadius="3" 
    BorderBrush="#FF000000" 
    Padding="3" 
    VerticalAlignment="Top">
    <Grid Height="200" x:Name="grid">
        <ListBox x:Name="listBox" Height="200">
            <ListBoxItem Content="ListBoxItem"/>
            <ListBoxItem Content="ListBoxItem"/>
            <ListBoxItem Content="ListBoxItem"/>
            <ListBoxItem Content="ListBoxItem"/>
        </ListBox>
    </Grid>
</Border>