WPF ListView: как оформить выбранные элементы закругленными углами, как в Проводнике
Это ссылка на заданный ранее вопрос, касающийся TreeView:
WPF TreeView: как оформить выбранные элементы закругленными углами, как в Проводнике
Мой вопрос: как перенести это решение на ListView?
Ответы немного беспорядочные, поэтому я не поняла, что там происходит!
2 ответа
Я думал, что этот вопрос звучит знакомо.:)
Таким образом, вы должны просто иметь возможность использовать тот же код, но затем использовать Visual Studio для поиска и замены TreeView
в ListView
, Конечно, есть несколько частей, таких как Image.Source
и IsMouseDirectlyOverItem
помощник, который вам может потребоваться изменить более тщательно. По большей части функция Find and Replace должна работать. TreeView
а также ListView
иметь абсолютно одинаковые свойства.
Дайте мне знать, если у вас возникнут проблемы с этим.
Вы можете изменить свой HierarchicalDataTemplate
к нормальному, как это:
<DataTemplate DataType="{x:Type viewmodels:ObjectBaseViewModel}">
<StackPanel Orientation="Horizontal" Margin="2,1,5,2">
<Grid Margin="0,0,3,0">
<Image Name="icon" Source="/ExplorerTreeView/Images/folder.png"/>
</Grid>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
Дайте мне знать, если я неправильно понял вашу проблему.
Ну, я делаю некоторые изменения, и я думаю, что теперь это работает лучше:
<ListView ...>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="BorderThickness" Value="1"/>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="helpers:ListViewHelper.IsMouseDirectlyOverItem" Value="False"/>
<Condition Property="IsSelected" Value="False"/>
<Condition Property="IsFocused" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="helpers:ListViewHelper.IsMouseDirectlyOverItem" Value="True"/>
<Condition Property="IsSelected" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFF8F8F8" Offset="0"/>
<GradientStop Color="#FFE5E5E5" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="#D9D9D9"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsFocused" Value="True"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFFAFBFD" Offset="0"/>
<GradientStop Color="#B8D6FB " Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="#D9D9D9"/>
</MultiTrigger>
</Style.Triggers>
<Style.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="2"/>
</Style>
</Style.Resources>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Resources>
<!-- Brushes for the selected item -->
<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFFAFBFD" Offset="0"/>
<GradientStop Color="#B8D6FB " Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
</ListView.Resources>
</ListView>
Проблема, с которой я столкнулся при последнем ответе, заключается в следующем: если, например, родительский элемент управления этого ListView также является ListView (или TreeView), когда вы переключаете щелчки с listView на другой, последний выбранный ListView всегда остается выбранным тоже. Я думаю, потому что это не зависит от других детей.