天天看點

WPF界面設計技巧(4)—自定義清單項樣式

WPF界面設計技巧(4)—自定義清單項樣式

有前面修改按鈕樣式的基礎,我們可以嘗試來定制一個即好看又好用的 ListBox ,今天先來講“好看”部分。

打開 Microsoft Visual Studio 2008 ,建立一個WPF應用程式,調整窗體大小,在窗體内建立一個 ListBox 和一個 Button ,按下圖所示布局。

WPF界面設計技巧(4)—自定義清單項樣式

在  Window1.xaml 中為窗體 Loaded 事件及按鈕 Click 事件添加事件處理:

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

Code

WPF界面設計技巧(4)—自定義清單項樣式

<Window x:Class="自定義清單項.Window1"

WPF界面設計技巧(4)—自定義清單項樣式

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

WPF界面設計技巧(4)—自定義清單項樣式

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

WPF界面設計技巧(4)—自定義清單項樣式

    Title="Window1" Height="351" Width="416" Loaded="Window_Loaded">

WPF界面設計技巧(4)—自定義清單項樣式

    <Grid>

WPF界面設計技巧(4)—自定義清單項樣式

        <ListBox Margin="26,21,27,54" Name="listBox1" />

WPF界面設計技巧(4)—自定義清單項樣式

        <Button Height="23" Click="button1_Click" Margin="26,0,0,13" Name="button1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="75" Background="AliceBlue">選擇檔案</Button>

WPF界面設計技巧(4)—自定義清單項樣式

    </Grid>

WPF界面設計技巧(4)—自定義清單項樣式

</Window>

WPF界面設計技巧(4)—自定義清單項樣式

在項目的引用中添加對 System.Windows.Froms 的引用,因為我們要使用其中的“打開檔案對話框”元件。

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

添加 using 語句,引用以下所示的命名空間。為 System.Windows.Froms 設定别名是為了防止和現有的命名空間内的名稱沖突。

WPF界面設計技巧(4)—自定義清單項樣式

在 Window1.xaml.cs 中書寫以下代碼:

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

using System;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Collections.Generic;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Linq;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Text;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Controls;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Data;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Documents;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Input;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Media;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Media.Imaging;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Navigation;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Windows.Shapes;

WPF界面設計技巧(4)—自定義清單項樣式

using System.IO;

WPF界面設計技巧(4)—自定義清單項樣式

using System.Collections.ObjectModel;

WPF界面設計技巧(4)—自定義清單項樣式

using Forms=System.Windows.Forms;

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

namespace 自定義清單項

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

{

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

    /**//// <summary>

WPF界面設計技巧(4)—自定義清單項樣式

    /// Window1.xaml 的互動邏輯

WPF界面設計技巧(4)—自定義清單項樣式

    /// </summary>

WPF界面設計技巧(4)—自定義清單項樣式

    public partial class Window1 : Window

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

        public Window1()

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

            InitializeComponent();

WPF界面設計技巧(4)—自定義清單項樣式

        }

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

        public ObservableCollection<FileInfo> FileList=new ObservableCollection<FileInfo>();

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

        private void Window_Loaded(object sender, RoutedEventArgs e)

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

            listBox1.ItemsSource = FileList;

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

        private void button1_Click(object sender, RoutedEventArgs e)

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

            var open=new Forms.OpenFileDialog 

WPF界面設計技巧(4)—自定義清單項樣式

{ Multiselect = true };

WPF界面設計技巧(4)—自定義清單項樣式

            if (open.ShowDialog() == Forms.DialogResult.OK)

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

                foreach (string f in open.FileNames) FileList.Add(new FileInfo(f));

WPF界面設計技巧(4)—自定義清單項樣式

            }

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

    }

WPF界面設計技巧(4)—自定義清單項樣式

}

我們采用泛型集合 ObservableCollection<FileInfo> 裝載檔案清單,ObservableCollection 不同于以往的集合類型,它會在其内容更改時向 WPF 控件發送更新通知,以確定顯示和資料的同步,是以 WPF 開發中,集合類型應多使用該類型。

在窗體載入完畢後,将 ListBox1 綁定到檔案清單 FileList 。

這時編譯并運作程式,選擇一些檔案,應當是這個樣子:

WPF界面設計技巧(4)—自定義清單項樣式

在App.xaml中添加如下樣式設定:

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

         <!--ListBox樣式-->

WPF界面設計技巧(4)—自定義清單項樣式

        <Style TargetType="ListBox">

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="BorderBrush" Value="#BDD4F1"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="BorderThickness" Value="1"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="Background" Value="#F8F7F5"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Hidden"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="VerticalContentAlignment" Value="Center"/>

WPF界面設計技巧(4)—自定義清單項樣式

        </Style>

WPF界面設計技巧(4)—自定義清單項樣式

        <!--ListBoxItem樣式-->

WPF界面設計技巧(4)—自定義清單項樣式

        <Style TargetType="ListBoxItem">

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="Foreground" Value="#B5BABF"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="OverridesDefaultStyle" Value="True"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="Height" Value="24"/>

WPF界面設計技巧(4)—自定義清單項樣式

            <Setter Property="Template">

WPF界面設計技巧(4)—自定義清單項樣式

                <Setter.Value>

WPF界面設計技巧(4)—自定義清單項樣式

                    <ControlTemplate TargetType="ListBoxItem">

WPF界面設計技巧(4)—自定義清單項樣式

                        <Border Name="back" BorderBrush="#F8F7F5" BorderThickness="0,1,0,1">

WPF界面設計技巧(4)—自定義清單項樣式

                            <Border.Background>

WPF界面設計技巧(4)—自定義清單項樣式

                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

WPF界面設計技巧(4)—自定義清單項樣式

                                    <GradientBrush.GradientStops>

WPF界面設計技巧(4)—自定義清單項樣式

                                        <GradientStopCollection>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <GradientStop Color="#F8F7F5" Offset="0.0"/>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <GradientStop Color="#F8F7F5" Offset="0.5"/>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <GradientStop Color="#F8F7F5" Offset="0.51"/>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <GradientStop Color="#F8F7F5" Offset="1"/>

WPF界面設計技巧(4)—自定義清單項樣式

                                        </GradientStopCollection>

WPF界面設計技巧(4)—自定義清單項樣式

                                    </GradientBrush.GradientStops>

WPF界面設計技巧(4)—自定義清單項樣式

                                </LinearGradientBrush>

WPF界面設計技巧(4)—自定義清單項樣式

                            </Border.Background>

WPF界面設計技巧(4)—自定義清單項樣式

                            <ContentPresenter Margin="2" VerticalAlignment="Center"/>

WPF界面設計技巧(4)—自定義清單項樣式

                        </Border>

WPF界面設計技巧(4)—自定義清單項樣式

                        <ControlTemplate.Triggers>

WPF界面設計技巧(4)—自定義清單項樣式

                            <Trigger Property="IsSelected" Value="True">

WPF界面設計技巧(4)—自定義清單項樣式

                                <Trigger.EnterActions>

WPF界面設計技巧(4)—自定義清單項樣式

                                    <BeginStoryboard>

WPF界面設計技巧(4)—自定義清單項樣式

                                        <Storyboard>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <DoubleAnimation To="32" Duration="0:0:0.3" Storyboard.TargetProperty="Height"/>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#F3C37C" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#952B00" Duration="0:0:0.2" Storyboard.TargetProperty="(ListBoxItem.Foreground).(SolidColorBrush.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#FFF" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#FFEF99" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#FFE13F" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[2].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#FFF3B0" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[3].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                        </Storyboard>

WPF界面設計技巧(4)—自定義清單項樣式

                                    </BeginStoryboard>

WPF界面設計技巧(4)—自定義清單項樣式

                                </Trigger.EnterActions>

WPF界面設計技巧(4)—自定義清單項樣式

                                <Trigger.ExitActions>

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

                                            <DoubleAnimation BeginTime="0:0:0.4" Duration="0:0:0.2" Storyboard.TargetProperty="Height"/>

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation Duration="0:0:0.2" Storyboard.TargetProperty="(ListBoxItem.Foreground).(SolidColorBrush.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[2].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[3].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

                                </Trigger.ExitActions>

WPF界面設計技巧(4)—自定義清單項樣式

                            </Trigger>

WPF界面設計技巧(4)—自定義清單項樣式

                            <Trigger Property="IsMouseOver" Value="True">

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#D8E6F5" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#617A98" Duration="0:0:0.2" Storyboard.TargetProperty="(ListBoxItem.Foreground).(SolidColorBrush.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#F6F9FD" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#E0EBF7" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#D7E5F6" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[2].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式

                                            <ColorAnimation To="#F6F9FD" Duration="0:0:0.2" Storyboard.TargetName="back" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[3].(GradientStop.Color)" />

WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式
WPF界面設計技巧(4)—自定義清單項樣式

                        </ControlTemplate.Triggers>

WPF界面設計技巧(4)—自定義清單項樣式

                    </ControlTemplate>

WPF界面設計技巧(4)—自定義清單項樣式

                </Setter.Value>

WPF界面設計技巧(4)—自定義清單項樣式

            </Setter>

WPF界面設計技巧(4)—自定義清單項樣式

最終效果(按鈕是沿用以前教程制作的樣式):

WPF界面設計技巧(4)—自定義清單項樣式

樣式代碼部分基本沒什麼可講的了,看看前面的教程應該都可以搞明白了,有不懂的地方請留言發問吧。

<a href="http://files.cnblogs.com/SkyD/WPFListBox.rar">源代碼下載下傳</a>

這次教程主要是為了後面做鋪墊,在下一篇教程中,我将會為大家講述如何定制清單項的内容,比如讓每個項目都可以顯示圖檔、檔案尺寸等資訊,借助 WPF 的強大界面設計特性,我們不需開發自定義控件,隻需用一些 XAML 代碼,就可以為普通控件賦予豐富的呈現功能,敬請關注。