ListView 預設的排列方向是縱向 ( Orientation="Vertical" ) ,但如果我們需要橫向顯示的 ListView 怎麼辦?
Blend for Visual Studio 現在就派上用場了。不隻是 ListView ,其他的控件也可以用 Blend 定制你自己的 UI 樣式。
下面建立一個項目 "HorizontalListViewDemo" ,用于示範橫向 ListView ,解決方案結構如下:( GitHub:
https://github.com/ZhangGaoxing/uwp-demo/tree/master/HorizontalListViewDemo )
。
項目分析
1. MainPage 的結構
MainPage 由兩部分組成,一個标題,一個 ListView 。
<Grid Background="Black">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--标題-->
<StackPanel Margin="15,15,15,0">
<TextBlock Text="Horizontal ListView Demo"
FontSize="30" FontWeight="Bold"
Foreground="White" />
<TextBlock Text="橫向 ListView" Foreground="White" />
</StackPanel>
<ListView Name="MyListView" Grid.Row="1" />
</Grid>
2. 用 Blend 定制樣式
首先右擊項目,點選“在 Blend 中設計”。
在“對象和時間線”中找到 "MyListView" ,右擊。
在“編輯其他模闆”中有 ItemTemplate,ItemContainerStyle,ItemsPanel 三個選項。ItemTemplate 用于資料綁定,資料綁定的模闆一般是手寫完成,用 Blend 也是可以建立資料綁定模闆的。ItemContainerStyle 是容器的樣式,說白了就是 ListView 中的 Item 的顯示樣式,像 Width,Background 等都可以在其中定制。ItemsPanel 是橫向 ListView 的關鍵,ListView 的顯示方向就在其中。下面是橫向 ListView 的 ItemsPanel xaml代碼。
<!--橫向布局-->
<ItemsPanelTemplate x:Key="HorizontalItemsPanelTemplate">
<VirtualizingStackPanel Orientation="Horizontal"
VerticalAlignment="Top"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollMode="Disabled"/>
</ItemsPanelTemplate>
3. 所有代碼
MainPage.xaml
<Page
x:Class="HorizontalListViewDemo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:HorizontalListViewDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="using:HorizontalListViewDemo.Model"
mc:Ignorable="d">
<Page.Resources>
<!--資料綁定模闆-->
<DataTemplate x:Key="DataTemplate" x:DataType="data:Book">
<StackPanel Margin="8">
<Image Source="{x:Bind CoverImage}" HorizontalAlignment="Center" Margin="0,0,0,5" Width="90" />
<TextBlock Text="{x:Bind Title}" Foreground="White" HorizontalAlignment="Center" FontSize="16" />
<TextBlock Text="{x:Bind Author}" Foreground="White" HorizontalAlignment="Center" FontSize="10" />
</StackPanel>
</DataTemplate>
<!--容器模闆-->
<Style x:Key="HorizontalItemContainerStyle" TargetType="ListViewItem">
<Setter Property="MinWidth" Value="{StaticResource SplitViewCompactPaneThemeLength}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="UseSystemFocusVisuals" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ListViewItemPresenter ContentTransitions="{TemplateBinding ContentTransitions}"
Control.IsTemplateFocusTarget="True"
SelectionCheckMarkVisualEnabled="False"
PointerOverBackground="{ThemeResource SystemControlHighlightListLowBrush}"
PointerOverForeground="{ThemeResource ListViewItemForegroundPointerOver}"
SelectedBackground="Transparent"
SelectedForeground="{ThemeResource SystemControlForegroundAccentBrush}"
SelectedPointerOverBackground="{ThemeResource SystemControlHighlightListLowBrush}"
PressedBackground="{ThemeResource SystemControlHighlightListMediumBrush}"
SelectedPressedBackground="{ThemeResource SystemControlHighlightListMediumBrush}"
DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
ContentMargin="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!--橫向布局-->
<ItemsPanelTemplate x:Key="HorizontalItemsPanelTemplate">
<VirtualizingStackPanel Orientation="Horizontal"
VerticalAlignment="Top"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollMode="Disabled"/>
</ItemsPanelTemplate>
</Page.Resources>
<Grid Background="Black">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--标題-->
<StackPanel Margin="15,15,15,0">
<TextBlock Text="Horizontal ListView Demo"
FontSize="30" FontWeight="Bold"
Foreground="White" />
<TextBlock Text="橫向 ListView" Foreground="White" />
</StackPanel>
<ListView Name="MyListView" Grid.Row="1"
SelectionMode="None" IsItemClickEnabled="True"
HorizontalAlignment="Center"
Margin="20" BorderThickness="1" BorderBrush="White"
ScrollViewer.HorizontalScrollMode="Enabled" ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollMode="Disabled"
ItemsSource="{x:Bind Books}"
ItemTemplate="{StaticResource DataTemplate}"
ItemContainerStyle="{StaticResource HorizontalItemContainerStyle}"
ItemsPanel="{StaticResource HorizontalItemsPanelTemplate}" />
</Grid>
</Page>
MainPage.xaml.cs
using HorizontalListViewDemo.Model;
using System.Collections.Generic;
using Windows.UI.Xaml.Controls;
namespace HorizontalListViewDemo
{
public sealed partial class MainPage : Page
{
private List<Book> Books;
public MainPage()
{
this.InitializeComponent();
Books = BookManager.GetBooks();
}
}
}
Book.cs
using System.Collections.Generic;
namespace HorizontalListViewDemo.Model
{
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string CoverImage { get; set; }
}
public class BookManager
{
public static List<Book> GetBooks()
{
var books = new List<Book>
{
new Book { BookId = 1, Title = "Vulpate", Author = "Futurum", CoverImage = "Assets/1.png" },
new Book { BookId = 2, Title = "Mazim", Author = "Sequiter Que", CoverImage = "Assets/2.png" },
new Book { BookId = 3, Title = "Elit", Author = "Tempor", CoverImage = "Assets/3.png" },
new Book { BookId = 4, Title = "Etiam", Author = "Option", CoverImage = "Assets/4.png" },
new Book { BookId = 5, Title = "Feugait Eros Libex", Author = "Accumsan", CoverImage = "Assets/5.png" },
new Book { BookId = 6, Title = "Nonummy Erat", Author = "Legunt Xaepius", CoverImage = "Assets/6.png" },
new Book { BookId = 7, Title = "Nostrud", Author = "Eleifend", CoverImage = "Assets/7.png" },
new Book { BookId = 8, Title = "Per Modo", Author = "Vero Tation", CoverImage = "Assets/8.png" },
new Book { BookId = 9, Title = "Suscipit Ad", Author = "Jack Tibbles", CoverImage = "Assets/9.png" },
new Book { BookId = 10, Title = "Decima", Author = "Tuffy Tibbles", CoverImage = "Assets/10.png" },
new Book { BookId = 11, Title = "Erat", Author = "Volupat", CoverImage = "Assets/11.png" },
new Book { BookId = 12, Title = "Consequat", Author = "Est Possim", CoverImage = "Assets/12.png" },
new Book { BookId = 13, Title = "Aliquip", Author = "Magna", CoverImage = "Assets/13.png" }
};
return books;
}
}
}
效果圖