我正在尝试为具有一个画布但多个“页面”的应用程序创建一个显示页面内容缩略图视图的列表框。是的,这可能不是最好的起点,但由于历史原因,这就是我所拥有的。我已经实现了 ListBox,其数据绑定到具有 PageData 的 ObservableCollection 的单例“工作簿”(页面上出现的所有内容,包括它的背景)。我真正想要的是能够在 ListBoxItem 被选中时更改它的边框颜色,并在其内容是托管集合的类中当前选定的项目时保持该边框颜色。
我的问题是:- 1/我无法让 ListBox 在程序启动时选择第一项。
2/当 ListBox 失去焦点时 SelectedIndex 总是-1(所以没有选择)
3/ 添加到列表框导致没有选择(SelectedIndex == -1)
4/ 使用触发器,我可以设置 selectedItem 的边框,但是当 ListBox 失去焦点时这会丢失。由于 ListBoxItem 显示不透明的图像,因此当失焦时使选择颜色保持不变的“标准”方式不起作用 - 即
<Style x:Key="PsThumb">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White"></SolidColorBrush>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White"></SolidColorBrush>
</Style.Resources>
</Style>
我的 ListBox 代码如下:-
<ListBox x:Name="PageSorter" Style="{StaticResource PsThumb}" Width="148" BorderThickness="4" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
VerticalAlignment="Stretch" ItemsSource="{Binding Pages,Source={StaticResource WorkBook}}" SelectedItem="{Binding Path=CurrentPageData, Mode=TwoWay}"
AllowDrop="True" ScrollViewer.VerticalScrollBarVisibility="Auto">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Border x:Name="border" BorderBrush="DarkGray" BorderThickness="4" Margin="2,4,2,4" CornerRadius="5">
<Border.Effect>
<DropShadowEffect ShadowDepth="6"/>
</Border.Effect>
<Image Source="{Binding Thumbnail}" Width="130" Height="95" Stretch="Fill"/>
</Border>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="Red"></Setter>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>