WPF中ListView自定義選中元素樣式


  在WPF中的ListView非常強大,利用各種Template可以實現許多自定義的樣式與功能,今天遇到一個自定義選中樣式的問題,弄了半天才找到解決方法,分享給大家。

  前台XAML代碼:

 1 <ListView Grid.Row="1" Name="LV_Test" SelectionMode="Multiple" Background="{x:Null}">
 2     <ListView.Template>
 3         <ControlTemplate>
 4             <Border CornerRadius="10" BorderBrush="RoyalBlue" BorderThickness="5">
 5                 <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" >
 6                     <ItemsPresenter />
 7                 </ScrollViewer>
 8             </Border>
 9         </ControlTemplate>
10     </ListView.Template>
11     <ListView.ItemsPanel>
12         <ItemsPanelTemplate>
13             <WrapPanel IsItemsHost="True"/>
14         </ItemsPanelTemplate>
15     </ListView.ItemsPanel>
16     <ListView.ItemContainerStyle>
17         <Style TargetType="{x:Type ListViewItem}">
18             <Setter Property="Template">
19                 <Setter.Value>
20                     <ControlTemplate TargetType="{x:Type ListViewItem}">
21                         <Border Name="BD_Collector" CornerRadius="5" Background="DarkSeaGreen" Width="auto" Height="30" Margin="5">
22                             <Label Content="{Binding}" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" FontSize="13" />
23                         </Border>
24                         <ControlTemplate.Triggers>
25                             <Trigger Property="IsMouseOver" Value="True">
26                                 <Setter TargetName="BD_Collector" Property="Background" Value="YellowGreen" />
27                             </Trigger>
28                             <Trigger Property="IsSelected" Value="True">
29                                 <Setter TargetName="BD_Collector" Property="Background" Value="DarkGreen" />
30                             </Trigger>
31                         </ControlTemplate.Triggers>
32                     </ControlTemplate>
33                 </Setter.Value>
34             </Setter>
35         </Style>
36     </ListView.ItemContainerStyle>
37 </ListView>

   這里首先用到了Template模板,主要是負責最上層的顯示,也就是說整個ListView的控件外觀,通過此模板設置可以替換掉控件默認的外觀。上面的代碼定義了一個邊框Boder和ScrollViewer的滾動條控件來囊括內部的數據,具體數據的內容,就由ItemsPresenter 來決定。接下來是ItemsPanel,用來設置數據展示的布局,可以為StackPanel,WrapPanel等各種方式都可以,數據內容則是對應了Template中的ItemsPresenter元素。ItemContainerStyle是實現自定義樣式的最關鍵控件,可以自定義Style應用於為每個項生成的容器元素。我就是把數據直接通過Setter填到了這個模版里的,然后定義Trigger來響應樣式改變的動作。

  好了,到了這里,我還介紹一下另一個很常用的模板,Itemtemplate,用其Datatemplate也能自定義實現數據顯示的樣式,可是這里需要區分的是,Itemtemplate是位於ListViewItem內部的,雖然可以實現顯示樣式,但是它無法獲取ListViewItem本身的樣式,可以認為ItemContainerStyle是更外一層的模板。

  我直接在ItemContainerStyle中定義了其Template,並設置了Controltemplate,在其中定義了數據,給需要變色的控件命名為"BD_Collector",然后通過觸發器來響應選中動作。之所以把數據寫在ItemContainerStyle中,而不是另外寫在Itemtemplate中,是因為Setter的TargetName只能識別到當前控件內的控件,在Itemtemplate中的控件是無法用於ItemContainerStyle中的。

  對應的后台代碼:

1 string id = TB_CollectorID.Text.Trim();
2 IList<int> values = new List<int>();
3 for (int i = 0; i < 100;++i )  values.Add(i);
4 LV_Test.ItemsSource = values;

  最終結果:

  如果想把這個樣式應用於多個ListView,可以把ItemContainerStyle內的Style定義成資源,然后在ListView中通用ItemContainerStyle屬性使用該資源即可。

  轉載請注明原址:http://www.cnblogs.com/lekko/archive/2012/07/20/2600435.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM