У меня есть список, в котором используется табличка с данными. Мне нужно, чтобы после выбора элемента я хотел сжать сам список, а не элемент списка внутри. Я пробовал использовать eventtrigger для selector.selected и unselected, но он не срабатывает. Я также поместил триггер данных на табличку данных, но я не могу получить доступ к списку отсюда. Любые идеи?
Сжать ListBox при выборе элемента
Ответы (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. (Для этого подойдет обычный триггер.)
Во-первых, правильное событие для подключения - 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>