1. 程式人生 > >WPF自定義控制元件與樣式:ScrollViewer與ListBox自定義樣式

WPF自定義控制元件與樣式:ScrollViewer與ListBox自定義樣式

一.前言

  申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結

本文主要內容:

  • ScrollViewer的樣式拆解及基本樣式定義;
  • ListBox集合控制元件的樣式定義;  

二.ScrollViewer自定義樣式

ScrollViewer在各種列表、集合控制元件中廣泛使用的基礎組建,先看看效果圖:

  如上圖,ScrollViewer簡單來說分兩部分,一個橫向的滾動條,一個垂直滾動條,兩個樣式、模板、功能都基本一樣,他們都是ScrollBar。以垂直滾動條為例,分解一下,分解圖:

  • 1:向上滑動的按鈕,用RepeatButton實現功能;
  • 2:上部分滑塊,功能同1,也是一個RepeatButton來實現的;
  • 3:中間可拖動滑塊,用一個Thumb來實現;
  • 4:下部分滑塊,和5功能一樣,向下滑動,用一個RepeatButton來實現;
  • 5:向下滑動的按鈕,用RepeatButton實現功能;

  上面實現的是一個標準的垂直滑動條ScrollBar組成,實際可用根據需求定製,實現不同效果的滑動效果。以上各部分的樣式程式碼:  

複製程式碼
    <sys:Double x:Key="ScrollBarSize">12</sys:Double
> <!--滾動兩邊按鈕樣式--> <Style x:Key="ScrollBarButton" TargetType="{x:Type RepeatButton}"> <Setter Property="Background" Value="Transparent"></Setter> <Setter Property="Foreground" Value="{StaticResource TextForeground}"></Setter> <Setter
Property="VerticalAlignment" Value="Center"></Setter> <Setter Property="HorizontalAlignment" Value="Center"></Setter> <Setter Property="Width" Value="auto"></Setter> <Setter Property="Height" Value="auto"></Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <TextBlock x:Name="FIcon" FontSize="12" Text="{TemplateBinding local:ControlAttachProperty.FIcon}" Margin="1" Style="{StaticResource FIcon}" /> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="{StaticResource MouseOverForeground}" TargetName="FIcon"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Foreground" Value="{StaticResource PressedForeground}" TargetName="FIcon"/> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Opacity" Value="0.5" TargetName="FIcon"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> <!--滾動條滑塊兩邊按鈕樣式--> <Style x:Key="ScrollBarTrackButton" TargetType="{x:Type RepeatButton}"> <Setter Property="Background" Value="Transparent"></Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <Border Background="Transparent"></Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <!--滾動條滑塊樣式--> <ControlTemplate x:Key="ThumbTemplate" TargetType="Thumb"> <Grid> <Border x:Name="Bg" CornerRadius="4" Margin="2" SnapsToDevicePixels="True" Background="{StaticResource ScrollBarForeround}"> <!--<Border.Background> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <GradientStop Color="#C7C0C0" Offset="0.15"/> <GradientStop Color="#AFA9A9" Offset=".5"/> <GradientStop Color="#989494" Offset=".5"/> <GradientStop Color="#858585" Offset="1"/> </LinearGradientBrush> </Border.Background>--> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="{StaticResource MouseOverForeground}" TargetName="Bg"></Setter> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="0.5" TargetName="Bg"></Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> <!--水平滾滾動條模板--> <ControlTemplate x:Key="HorizontalScrollBar" TargetType="{x:Type ScrollBar}"> <Grid x:Name="HorizontalRoot" Height="{TemplateBinding Height}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <!--外部背景,好像不用更好看--> <!--<Border x:Name="Bg" Grid.Column="0" Grid.ColumnSpan="3" CornerRadius="0" Opacity="0" Background="#858585"/>--> <!--內部背景--> <Border x:Name="BgInner" Grid.Column="1" Margin="0" SnapsToDevicePixels="True" Opacity="0.3" CornerRadius="6" Background="{StaticResource ScrollBarBackground}"/> <!--左按鈕--> <Border Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center"> <RepeatButton local:ControlAttachProperty.FIcon="&#xe65e;" Style="{StaticResource ScrollBarButton}" x:Name="HorizontalSmallDecrease" IsTabStop="False" Interval="50" Margin="0,1,0,0" Command="ScrollBar.LineLeftCommand"/> </Border> <!--中間滑動區域--> <Track x:Name="PART_Track" IsDirectionReversed="False" Grid.Column="1"> <!--左滑塊--> <Track.DecreaseRepeatButton> <RepeatButton x:Name="HorizontalLargeDecrease" Command="ScrollBar.PageLeftCommand" IsTabStop="False" Interval="50" Style="{DynamicResource ScrollBarTrackButton}" /> </Track.DecreaseRepeatButton> <!--中間滑塊 Margin="1" VerticalAlignment="Center" VerticalContentAlignment="Center" --> <Track.Thumb> <Thumb Template="{StaticResource ThumbTemplate}" /> </Track.Thumb> <!--右滑塊--> <Track.IncreaseRepeatButton> <RepeatButton x:Name="HorizontalLargeIncrease" Command="ScrollBar.PageRightCommand" IsTabStop="False" Interval="50" Style="{DynamicResource ScrollBarTrackButton}" /> </Track.IncreaseRepeatButton> </Track> <!--右按鈕--> <Border Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center"> <RepeatButton local:ControlAttachProperty.FIcon="&#xe605;" Style="{StaticResource ScrollBarButton}" IsTabStop="False" Interval="50" Margin="0,1,0,0" Command="ScrollBar.LineRightCommand"/> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter TargetName="BgInner" Property="Opacity" Value="0.5"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> <!--垂直滾滾動條模板--> <ControlTemplate x:Key="VerticalScrollBar" TargetType="{x:Type ScrollBar}"> <Grid x:Name="VerticalRoot" Height="{TemplateBinding Height}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*"

相關推薦

WPF定義控制元件樣式ScrollViewerListBox定義樣式

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。 本文主要內容: ScrollViewer的樣式拆解及基本樣式定義

定義控制元件讓TextView的drawableLeft文字一起居中顯示

Drawable[] drawables = getCompoundDrawables();          if  (drawables != 

Android定義控制元件系列八詳解onMeasure()(二)--利用onMeasure測量來實現圖片拉伸永不變形,解決螢幕適配問題

        上一篇文章詳細講解了一下onMeasure/measure方法在Android自定義控制元件時的原理和作用,參看博文:Android自定義控制元件系列七:詳解onMeasure()方法中如何測量一個控制元件尺寸(一),今天就來真正實踐一下,讓這兩個方法大顯神威來幫我們搞定圖片的螢幕適配問題。

定義控制元件讓EditText的drawableLeft文字一起居中顯示

如上圖  專案中要求的顯示效果是serch圖片和EditText的文字一起在中間位置。 嘗試設定了很多EditText均不能實現滿意的效果,其中: android:drawableLeft="" android:drawableRight=""設定的位置均在兩邊,不能滿足

Android定義控制元件系列七詳解onMeasure()方法中如何測量一個控制元件尺寸(一)

自定義view/viewgroup要重寫的幾個方法:onMeasure(),onLayout(),onDraw()。(不熟悉的話可以檢視專欄的前幾篇文章:)。         今天的任務就是詳細研究一下protected void onMeasure(int wid

Android定義控制元件系列一如何測量控制元件尺寸

測量控制元件尺寸(寬度、高度)是開發自定義控制元件的第一步,只有確定尺寸後才能開始畫(利用canvas在畫布上畫,我們所使用的控制元件實際上都是這樣畫上去的)。當然,這個尺寸是需要根據控制元件的各個部分計算出來的,比如:padding、文字大小,間距等。非容器控制元件的onM

Android定義控制元件系列 十利用新增定義佈局來搞定觸控事件的分發,解決組合介面中特定控制元件響應特定方向的事件

        這個例子是比較有用的,基本上可以說,寫完這一次,以後很多情況下,直接拿過來addView一下,然後再addInterceptorView一下,就可以輕輕鬆鬆的達到組合介面中特定控制元件來響應特定方向的觸控事件了。         在寫Android應用

Android定義控制元件系列一Android如何實現老版優酷客戶端三級環形選單

轉載連結:http://blog.csdn.net/cyp331203/article/details/40423727 先來看看效果: 一眼看上去好像還挺炫的,感覺比較複雜。。。實際上並不難,下面我們來看看如何實現: 基本素

Android定義控制元件系列二定義開關按鈕(一)

這一次我們將會實現一個完整純粹的自定義控制元件,而不是像之前的組合控制元件一樣,拿系統的控制元件來實現;計劃分為三部分:自定義控制元件的基本部分,和自定義控制元件的自定義屬性; 下面就開始第一部分的編寫,本次以一個定義的開關按鈕為例,下面就開始吧: 先看看效果,一個點選開

【轉】WPF定義控制元件樣式(3)-TextBox & RichTextBox & PasswordBox樣式、水印、Label標籤、功能擴充套件

一.前言.預覽   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要是對文字輸入控制元件進行樣式開發,及相關擴充套件功能開發,主要內容包括: 基本文字框TextBox控制元件樣式及擴充套件功能,實現了樣式、水印、Label標籤、功

【轉】WPF定義控制元件樣式(5)-Calendar/DatePicker日期控制元件定義樣式及擴充套件

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。 本文主要內容: 日曆控制元件Calendar自定義樣式; 日期控制元件DatePicker自定義樣式,及Label標籤、水印、清除日期功能擴充套件; 二.Calend

【轉】WPF定義控制元件樣式(9)-樹控制元件TreeView選單Menu-ContextMenu

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 選單Menu的自定義樣式; 右鍵選單ContextMenu的自定義樣式; 樹控制元件TreeView的自定義樣式,及右鍵選單實現。 二.選單M

【轉】WPF定義控制元件樣式(8)-ComboBox定義多選控制元件MultComboBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 下拉選擇控制元件ComboBox的自定義樣式及擴充套件; 自定義多選控制元件MultiComboBox; 二.下拉選擇控制元件ComboBox的自

【轉】WPF定義控制元件樣式(11)-等待/忙/正在載入狀態-控制元件實現

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要有三種實現方式: 簡單忙碌狀態控制元件BusyBox; Win8/win10效果忙碌狀態控制元件ProgressRing; 彈出非同步等待框WaitingB

【轉】WPF定義控制元件樣式(12)-縮圖ThumbnailImage /gif動畫圖/圖片列表

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。   本文主要針對WPF專案開發中圖片的各種使用問題,經過總結,把一些經驗分享一下。內容包括: WPF常

【轉】WPF定義控制元件樣式(13)-定義窗體Window & 適應內容大小訊息框MessageBox

一.前言   申明:WPF自定義控制元件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐步釋出的等。   本文主要內容: 自定義Window窗體樣式; 基於自定義窗體實現自定義MessageBox訊息提示框; 二.自定義Window窗體樣式   自定義的Window

WPF 定義控制元件的坑(蠢的定義控制元件內容不顯示)

原文: WPF 自定義控制元件的坑(蠢的:自定義控制元件內容不顯示) 自定義控制元件不顯示內容 由於工作需要在寫WPF,其中想要實現一些自己的控制元件所以直接自定義了控制元件博主是繼承了ContenControl的控制元件開始寫的但是發現不管設定Content屬性為任何都是不顯示

定義控制元件之繪圖篇(四)canvas變換操作

前言:前幾篇講解了有關canvas繪圖的一些操作,今天更深入一些,講講對畫布的操作,這篇文章不像前幾篇那麼容易理解,如果以前沒有接觸過畫布的童鞋可能比較難以理解,為什麼會這樣。我儘量多畫圖,讓大家更清晰明白。前幾天偶然看到一篇文章,寫的樸實無華,充滿正能量,我非常喜歡裡面的一

定義控制元件之繪圖篇Canvas圖層(二)

public class CLIP_TO_LAYER_SAVE_FLAG_VIEW extends View {       private Paint mPaint;       public CLIP_TO_LAYER_SAVE_FLAG_VIEW(Context context, Att

[WPF定義控制元件庫] 定義控制元件的程式碼如何ControlTemplate互動

1. 前言 WPF有一個靈活的UI框架,使用者可以輕鬆地使用程式碼控制控制元件的外觀。例設我需要一個控制元件在滑鼠進入的時候背景變成藍色,我可以用下面這段程式碼實現: protected override void OnMouseEnter(MouseEventArgs e) { base.OnMou