データテンプレートを使用するリストボックスがあります。私が必要としているのは、アイテムが選択された後、内部のリストアイテムではなく、リストボックス自体を縮小したいという方法です。selector.selected および unselected でイベントトリガーを試しましたが、起動しません。データテンプレートにもデータトリガーを配置しましたが、ここからリストボックスにアクセスできません。何か案は?
2 に答える
これは少し間接的な解決策ですが... ListBox 自体に DataTrigger を配置し、SelectedItems.Count にバインドすることでこれを処理できます。ListBox のデフォルトを「小さい」外観にする必要があります。次に、トリガーは SelectedItems.Count が 0 であるかどうかを確認し、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 でトリガーし、適切なセッターを適用して「縮小」変換を逆にすることができます。たとえば、負の Margin を適用するか、逆の ScaleTransform を適用します。(これには通常のトリガーで十分です。)
まず、フックする正しいイベントはSelectionChanged
notです。次に、ウィンドウ レベルでSelected
a を使用できます。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>