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