<Window.Resources>
<Style TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Margin" Value="https://bbs.csdn.net/topics/5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="b1" BorderBrush="Orange" BorderThickness="4" >
<Border.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected,RelativeSource={RelativeSource TemplatedParent}}" Value="https://bbs.csdn.net/topics/true">
<Setter Property="Border.BorderBrush" Value="https://bbs.csdn.net/topics/Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<StackPanel>
<StackPanel.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected,RelativeSource={RelativeSource TemplatedParent}}" Value="https://bbs.csdn.net/topics/true">
<Setter Property="StackPanel.Visibility" Value="https://bbs.csdn.net/topics/Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
<ContentPresenter></ContentPresenter>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="ListBoxItem.IsMouseOver" Value="https://bbs.csdn.net/topics/true">
<Setter Property="Background" Value="https://bbs.csdn.net/topics/DarkBlue"/>
</Trigger>
<Trigger Property="ListBoxItem.IsSelected" Value="https://bbs.csdn.net/topics/true">
<Setter Property="Foreground" Value="https://bbs.csdn.net/topics/Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Background="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem},Path=Background}" Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
上面代碼第十五行,當listbox里面的listboxitem選中的時候,想改變border的顏色,但是并沒有生效,但是收縮stackpanel的生效了,請教一下為什么會這樣呢?
uj5u.com熱心網友回復:
我很難和你說清為什么寫在 Style 里面不會觸發,但是能告訴你的是推薦寫在 ControlTemplate.Triggers 里面,我看到你上面的代碼是添加了 ControlTemplate.Triggers 的,但是不知道為什么要通過 Style 加上向上系結的方式獲取,這個方式獲取需要注意的東西有點多,也有點繞簡單解決方法就是和屬性相關的觸發寫在 ControlTemplate.Triggers 里面,請看代碼
<Window.Resources>
<Style TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Margin" Value="https://bbs.csdn.net/topics/5" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="b1" BorderBrush="Orange" BorderThickness="4">
<StackPanel x:Name="StackPanel" Margin="10,10,10,10" Background="#A2A2A2">
<ContentPresenter />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="https://bbs.csdn.net/topics/True">
<Setter TargetName="b1" Property="BorderBrush" Value="https://bbs.csdn.net/topics/Red" />
<Setter TargetName="StackPanel" Property="Visibility" Value="https://bbs.csdn.net/topics/Collapsed" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="ListBoxItem.IsMouseOver" Value="https://bbs.csdn.net/topics/true">
<Setter Property="Background" Value="https://bbs.csdn.net/topics/DarkBlue" />
</Trigger>
<Trigger Property="ListBoxItem.IsSelected" Value="https://bbs.csdn.net/topics/true">
<Setter Property="Foreground" Value="https://bbs.csdn.net/topics/Red" />
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock
Background="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem},Path=Background}"
Text="{Binding Path=Name}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
可運行的代碼請看 https://github.com/lindexi/lindexi_gd/tree/bdead1c7f6021d0e89e6f828868090c5b1f2a7ed/Babukeelleneeoai
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/43094.html
標籤:C#
上一篇:請教大蝦們一個問題,謝謝
