Сжать ListBox при выборе элемента

У меня есть список, в котором используется табличка с данными. Мне нужно, чтобы после выбора элемента я хотел сжать сам список, а не элемент списка внутри. Я пробовал использовать eventtrigger для selector.selected и unselected, но он не срабатывает. Я также поместил триггер данных на табличку данных, но я не могу получить доступ к списку отсюда. Любые идеи?


person Chad    schedule 03.01.2010    source источник


Ответы (2)


Это немного косвенное решение, но ... вы можете справиться с этим, поместив DataTrigger в сам ListBox и привязав к SelectedItems.Count. Вам нужно, чтобы ListBox по умолчанию имел "меньший" вид. Затем триггер проверит, имеет ли значение SelectedItems.Count значение 0, и если да, он должен сделать ListBox больше. В следующем примере я устанавливаю ListBox.Background для простоты, но вы должны иметь возможность адаптировать его для работы с LayoutTransform или RenderTransform, шириной / высотой или чем-то еще, что вы используете для «сжатия» 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 и применить подходящий сеттер, чтобы отменить «сжатие» преобразования - например, применить отрицательное поле Margin или обратное ScaleTransform. (Для этого подойдет обычный триггер.)

person itowlson    schedule 03.01.2010

Во-первых, правильное событие для подключения - 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>
person Aviad P.    schedule 03.01.2010