我试图找到一个好的解决方案并尝试了这个,但遗憾的是它没有奏效。对于在同一条船上并碰巧发现自己在这里的任何人,我发现了两种非常可靠的方法。有很多其他方法可以解决这个问题,但是我想避免使用任何额外的 DLL(也就是使用 interactivity)或其他框架。
附加行为
句柄 dlf 的用户在这里发布了一个很好的答案:
GridView DoubleClick
他发布了一个很棒的附加行为,我已经在多种条件下对其进行了测试,效果非常好。
纯 XAML
我个人尝试在 XAML 中做尽可能多的事情。本质上,我为ListViewItem 创建了一个ControlTemplate。 ControlTemplate 需要调整以包含您想要的任何突出显示颜色效果,并且还必须包含您选择的任何行的数据。关于这一点的重要部分是即使有多个列也能很好地工作。您还需要为每个Command 提供一个单独的ControlTemplate。
这是一个示例,其中包含 2 列 ListView 和绑定到集合的渐变突出显示效果。在我的ControlTemplate 中需要注意的一件事是,我将TextBlock 的宽度设置为与列的宽度相匹配。
希望这对寻找的人有所帮助。
控制模板:
<ControlTemplate x:Key="Selected_Item_Template" TargetType="{x:Type ListViewItem}">
<Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="19" Margin="0,0,0,0" BorderBrush="LightGray" BorderThickness="1">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF74A1C7" Offset="0.5"/>
<GradientStop Color="SteelBlue" Offset="0.5"/>
</LinearGradientBrush>
</Border.Background>
<Border.InputBindings>
<MouseBinding Gesture="LeftDoubleClick"
CommandParameter="{Binding SelectedItems, ElementName=your_listview}"
Command="{Binding Path=DataContext.Some_DoubleClick_ICommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
</Border.InputBindings>
<DockPanel>
<TextBlock Width="{Binding ActualWidth, ElementName=column_1}" Margin="6,0,0,0" Text="{Binding Column1}" />
<TextBlock Margin="0,0,0,0" Text="{Binding Column2}" />
</DockPanel>
</Border>
</ControlTemplate>
ListView:
<ListView x:Name="your_listview"
ItemsSource="{Binding Some_Source_Collection}"
SelectedIndex="{Binding Some_Int_Variable}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="BorderBrush" Value="LightGray" />
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="White" />
<Setter Property="Template" Value="{StaticResource Selected_Item_Template}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="false" />
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="White" />
<Setter Property="Template" Value="{StaticResource Selected_Item_Template}" />
</MultiTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView x:Name="your_listview_gridview">
<GridViewColumn x:Name="column_1" Header="Name:" Width="100"
DisplayMemberBinding="{Binding Column1}">
<GridViewColumn.HeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="IsEnabled" Value="True"/>
</Style>
</GridViewColumn.HeaderContainerStyle>
</GridViewColumn>
<GridViewColumn x:Name="column_2" Header="Path:" Width="250"
DisplayMemberBinding="{Binding Column2}">
<GridViewColumn.HeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="IsEnabled" Value="True"/>
</Style>
</GridViewColumn.HeaderContainerStyle>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
如果您对将SelectedItems 转换成可用的东西有任何疑问或需要帮助,请私信我。