我们知道WP8上的开发推荐使用LongListSelector代替ListBox,它的效率要比ListBox高。
但是LongListSelector并没有ListBox的点击凹陷效果,而且VisualStateGroups里也没有对应的VisualState提供给我们直接修改,
所以要想实现该点击凹陷效果只能想其它办法了。
以下是个人研究的一种方法:
1.新建一个UserControl,在xaml里删除它的所有子控件:
<UserControl x:Class="FYDZHWP8.LongListItemContainer" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Foreground="Transparent" Background="Transparent" d:DesignHeight="480" d:DesignWidth="480"> </UserControl>2. 这个LongListItemContainer对应的cs代码内容如下:
public partial class LongListItemContainer : UserControl { public LongListItemContainer() { InitializeComponent(); this.MouseLeftButtonDown += OnPointerDown; this.MouseLeftButtonUp += OnPointerUp; this.MouseLeave += OnPointerUp; } private void OnPointerDown(object sender, System.Windows.Input.MouseEventArgs e) { if ((sender as UIElement) != null) (sender as UIElement).Projection = new PlaneProjection() { LocalOffsetZ = -30 }; } private void OnPointerUp(object sender, System.Windows.Input.MouseEventArgs e) { if ((sender as UIElement) != null) (sender as UIElement).Projection = null; } }即,处理点击事件进行Z变换,以实现对Item的缩小显示(凹陷效果)。
3.在LongListSelector的ItemTemplate中使用该LongListItemContainer作为原来Template的父控件:
<phone:LongListSelector.ItemTemplate> <DataTemplate> <local:LongListItemContainer> <Grid Margin="0,0,0,10"> <TextBlock TextWrapping="NoWrap" Margin="0,0,0,0" TextAlignment="Left" TextTrimming="WordEllipsis" VerticalAlignment="Top" Foreground="White" FontSize="30" Text="{Binding Title}"/> <TextBlock TextWrapping="Wrap" Height="80" Margin="0,40,0,0" TextAlignment="Left" TextTrimming="WordEllipsis" VerticalAlignment="Top" Foreground="DarkGray" FontSize="20" Text="{Binding Content}" /> </Grid> </local:LongListItemContainer> </DataTemplate> </phone:LongListSelector.ItemTemplate>