中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

談?wù)凷ilverlight 2中的視覺(jué)狀態(tài)管理 Part1

概述

在WPF和Silverlight中的控件模板支持自定義控件的觀感,所謂的外觀,指控件的視覺(jué)效果;而感覺(jué)則是控件交互的響應(yīng)性,如在控件上按下鼠標(biāo)、控件獲得焦點(diǎn)等狀態(tài)的改變。微軟在Silverlight 2 Beta 2中引進(jìn)了一個(gè)新的概念視覺(jué)狀態(tài)管理(Visual State Manager),為我們創(chuàng)建交互性的控件模板提供了極大的方便。接下來(lái)我將會(huì)用幾篇文章來(lái)介紹一下Silverlight 2中的視覺(jué)狀態(tài)管理。

在定義控件時(shí),我們需要嚴(yán)格區(qū)分控件的視覺(jué)效果和控件的邏輯,這樣當(dāng)我們修改控件外觀時(shí)將不會(huì)影響控件邏輯。Silverlight 2 Beta 2中提出的部件和狀態(tài)模型,能夠很好的解決這一問(wèn)題,本文我們先來(lái)看一些基本的概念。

部件(Parts)

所謂的部件(Parts)是指在空間模板中元素,控件邏輯將會(huì)控制這些部件來(lái)完成一些特定的控件,但它并不關(guān)心這些部件的視覺(jué)效果,如下圖所示對(duì)于一個(gè)Silder控件來(lái)說(shuō):

TerryLee_0084

在上圖中的Silder控件由四個(gè)部件構(gòu)成:一個(gè)名為HorizontalThumb的Thumb控件,一個(gè)名為HorizontalLargeChangeIncrease的RepeatButton控件,一個(gè)名為HorizontalLargeChangeDecrease的RepeatButton控件,一個(gè)名為HorizontalTemplate的FrameworkElement元素。這些元素都將會(huì)在控件邏輯中進(jìn)行控制,如當(dāng)按下HorizontalLargeChangeIncrease時(shí)滑塊將向右移動(dòng),按下HorizontalLargeChangeDecrease時(shí)滑塊將向左移動(dòng)

需要注意的一點(diǎn)是并不是所有的控件都具有部件,有些控件可能沒(méi)有部件,大家可以去查閱Silverlight 2 SDK。

視覺(jué)狀態(tài)(Visual States)

視覺(jué)狀態(tài)是指控件定義的一系列狀態(tài)如MouseOver、Pressed等,它代表了控件處于某一個(gè)特定的邏輯狀態(tài)。如下面這幅圖中定義的CheckBox控件的一些視覺(jué)狀態(tài):

TerryLee_0086

默認(rèn)狀態(tài)下,CheckBox控件將顯示為Normal狀態(tài);當(dāng)CheckBox被選中時(shí),它將顯示為Checked狀態(tài);當(dāng)Checked為null,CheckBox將顯示為Indeterminate狀態(tài)。

控件的視覺(jué)狀態(tài)在Silverlight 2中會(huì)使用VisualState類來(lái)表示,它的定義非常簡(jiǎn)單如下代碼所示:

public sealed class VisualState : DependencyObject{    public VisualState();    public string Name { get; }    public Storyboard Storyboard { get; set; }}

狀態(tài)遷移(State Transitions)

狀態(tài)遷移是指控件從一個(gè)狀態(tài)過(guò)渡到另外一個(gè)狀態(tài),如Button控件從MouseOver狀態(tài)到Pressed狀態(tài)這個(gè)過(guò)渡過(guò)程,通過(guò)Storyboard來(lái)定義的動(dòng)畫(huà)。

TerryLee_0091

狀態(tài)遷移在Silverlight 2中使用VisualTransition類來(lái)表示,它的定義如下代碼所示:

public class VisualTransition{    public VisualTransition();    public Duration Duration { get; set; }    public string From { get; set; }    public Storyboard Storyboard { get; set; }    public string To { get; set; }}

狀態(tài)組(StateGroups)

狀態(tài)組,是把控件所有互斥的狀態(tài)放在同一個(gè)組中,這樣一個(gè)狀態(tài)它只能位于一個(gè)組中,所謂的互斥是指控件不肯能同時(shí)具有該組中的兩種狀態(tài),如Checked和Unchecked兩個(gè)狀態(tài)不可能同時(shí)存在。以CheckBox控件為例,我們來(lái)看一下它的狀態(tài)組:

TerryLee_0092 

從上表中我們可以看到,對(duì)于CheckBox控件來(lái)說(shuō),它有三個(gè)狀態(tài)組:FocusStates、CommonStates、CheckStates。一個(gè)CheckBox控件可以同時(shí)為Focused、MouseOver和Indeterminate狀態(tài),因?yàn)樗鼈兲幵诓煌臓顟B(tài)組。現(xiàn)在對(duì)于這個(gè)問(wèn)題:“CheckBox控件的狀態(tài)是什么?”答案應(yīng)該由三部分組成,分別為三個(gè)狀態(tài)組中的一個(gè)。狀態(tài)組是在Silverlight 2中提出的一個(gè)新的概念,它由VisualStateGroup類來(lái)提供,其中除了狀態(tài)組名屬性外,維護(hù)了一個(gè)視覺(jué)狀態(tài)的集合和一個(gè)狀態(tài)遷移的集合,如下代碼所示:

public sealed class VisualStateGroup : DependencyObject{    public VisualStateGroup();    public string Name { get; }    public Collection<VisualState> States { get; set; }    public Collection<VisualTransition> Transitions { get; set; }}

使用狀態(tài)組是一個(gè)非常棒的模型,在Beta 1中,CheckBox控件有12種狀態(tài)(其中Focus在Beta 1中是作為部件而不是狀態(tài)),這12種狀態(tài)是通過(guò)CommonStates和CheckStates組合而成的,如PressedUnchecked、MouseOverChecked等,而在Beta 2中,加上FocusStates狀態(tài),CheckBox控件總共只有10種狀態(tài)。

控件的狀態(tài)和狀態(tài)組是通過(guò)TemplateVisualState特性來(lái)聲明的,如在CheckBox控件中的聲明如下代碼所示:

[TemplateVisualStateAttribute(Name = "ContentFocused", GroupName = "FocusStates")][TemplateVisualStateAttribute(Name = "MouseOver", GroupName = "CommonStates")][TemplateVisualStateAttribute(Name = "Focused", GroupName = "FocusStates")][TemplateVisualStateAttribute(Name = "Checked", GroupName = "CheckStates")][TemplateVisualStateAttribute(Name = "Unchecked", GroupName = "CheckStates")][TemplateVisualStateAttribute(Name = "Indeterminate", GroupName = "CheckStates")][TemplateVisualStateAttribute(Name = "Pressed", GroupName = "CommonStates")][TemplateVisualStateAttribute(Name = "Disabled", GroupName = "CommonStates")][TemplateVisualStateAttribute(Name = "Unfocused", GroupName = "FocusStates")][TemplateVisualStateAttribute(Name = "Normal", GroupName = "CommonStates")]public class CheckBox : ToggleButton{     // ......}

視覺(jué)狀態(tài)管理器

我們?cè)賮?lái)看一下視覺(jué)狀態(tài)管理器的概念,有了上面這些概念,在Silverlight 2中視覺(jué)狀態(tài)管理是通過(guò)視覺(jué)狀態(tài)管理器(Visual State Manager)來(lái)進(jìn)行的,Silverlight 2中提供了VisualStateManager類,如下所示:

public class VisualStateManager : DependencyObject{    public static DependencyProperty CustomVisualStateManagerProperty;    public VisualStateManager();    public static VisualStateManager GetCustomVisualStateManager(DependencyObject obj);    public static Collection<VisualStateGroup> GetVisualStateGroups(DependencyObject obj);    public static bool GoToState(Control control, string stateName, bool useTransitions);    protected virtual bool GoToStateCore(Control control, FrameworkElement templateRoot,         string stateName, VisualStateGroup group, VisualState state, bool useTransitions);    public static void SetCustomVisualStateManager(DependencyObject obj,         VisualStateManager value);}

視覺(jué)狀態(tài)管理器負(fù)責(zé)管理控件的狀態(tài)和狀態(tài)組以及狀態(tài)的遷移。

 

 

狀態(tài)變化

外部事件觸發(fā)將會(huì)引起狀態(tài)的變化,進(jìn)而引發(fā)狀態(tài)遷移,整個(gè)過(guò)程如下流程圖所示:

TerryLee_0093

總結(jié)

本文介紹了Silverlight 2中視覺(jué)狀態(tài)管理的一些基本概念,下篇文章,我們將結(jié)合實(shí)例看看如何使用視覺(jué)狀態(tài)管理來(lái)定制控件的觀感。

NET技術(shù)談?wù)凷ilverlight 2中的視覺(jué)狀態(tài)管理 Part1,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久成 | 在线视频91 | 国产精品一区二区在线播放 | 午夜精品久久久久久 | 69福利影院 | 国产福利在线小视频 | 精品久久久久久久 | 在线欧美小视频 | 黄色片大全在线观看 | 在线观看亚洲精品视频 | 成人高清视频在线观看 | 超碰91在线 | 亚洲精品久久久久久国产精华液 | 成人av一区二区三区 | 久久三区 | 伊人网影院 | 国产精品有限公司 | 精品久久精品 | 一区二区三区四区国产 | 国产高清在线观看 | 波多野结衣中文视频 | 精品中文视频 | 亚洲激情网站 | 日韩欧美在线观看 | 亚洲第一免费播放区 | 亚洲男人天堂av | 亚洲天堂av在线 | 99精品视频一区二区三区 | 成人精品一区二区 | 亚洲国产片 | 成人性生交大片免费看中文带字幕 | 中文字幕在线一 | 中文字幕在线中文 | 中文字幕不卡在线88 | 99综合| 一级黄色夫妻生活 | 亚洲精品成人av久久 | 国产一区91精品张津瑜 | 日日操视频 | 中午字幕在线观看 | 伊人狠狠干 |