設定控制項中焦點的樣式和 FocusVisualStyle
更新:2007 年 11 月
Windows Presentation Foundation (WPF) 提供兩種類似的機制,可用來變更控制項取得鍵盤焦點時的視覺外觀。第一種機制是在套用至控制項的樣式或樣板內,使用諸如 IsKeyboardFocused 等屬性的屬性 setter。第二種機制則是提供個別樣式做為 FocusVisualStyle 屬性的值;此「焦點視覺化樣式」會針對繪製於控制項上方的裝飾項建立個別的視覺化樹狀結構,而非透過取代來變更控制項或其他 UI 項目的視覺化樹狀結構。本主題討論上述機制適用的每一種案例。
這個主題包含下列章節。
- 焦點視覺化樣式的用途
- 預設焦點視覺化樣式行為
- 使用焦點視覺化樣式的時機
- 如何建立焦點視覺化樣式
- 使用焦點視覺化樣式的替代方案
- 相關主題
焦點視覺化樣式的用途
焦點視覺化樣式提供一種通用的「物件模型」,用於引入以任何 UI 項目之鍵盤巡覽為基礎的視覺化使用者回應。即使未套用新範本到控制項,或是不知道具體的樣板組成,也可以使用這項功能。
不過,就是因為視覺化樣式功能在不知道控制項樣板的情況下還能發揮作用,所以使用焦點視覺化樣式可以顯示的控制項視覺化回應也一定很有限。這項功能的實際用途是可以將不同的視覺化樹狀結構 (裝飾項) 重疊在控制項呈現透過其樣板建立的視覺化樹狀目錄上。您可使用填入 FocusVisualStyle 屬性的樣式來定義這個不同的視覺化樹狀結構。
預設焦點視覺化樣式行為
只有當焦點動作是由鍵盤啟動時,焦點視覺化樣式才會產生作用。任何滑鼠動作或程式設計焦點變更都會停用焦點視覺化樣式的模式。如需兩種焦點模式間差異的詳細資訊,請參閱焦點概觀。
控制項的佈景主題包括一個預設焦點視覺化行為,這個行為會成為該佈景主題中所有控制項的焦點視覺化樣式。此佈景主題樣式是以靜態索引鍵 FocusVisualStyleKey 的值識別。當您在應用程式層級宣告自己的焦點視覺化樣式時,便會取代來自佈景主題的這個預設樣式行為。另外,若您定義整個佈景主題,則應該使用相同的索引鍵來定義整個佈景主題的預設行為。
在佈景主題中,預設焦點視覺化樣式通常非常簡單。以下提供簡略的近似樣式:
<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle StrokeThickness="1"
Stroke="Black"
StrokeDashArray="1 2"
SnapsToDevicePixels="true"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用焦點視覺化樣式的時機
在概念上來說,套用至控制項的焦點視覺化樣式,其外觀在不同的控制項之間應該都會保持一致。確保這種一致性的其中一種方法是只在撰寫整個佈景主題時變更焦點視覺化樣式,使得佈景主題中定義的每個控制項取得完全相同的焦點視覺化樣式,或是各控制項在視覺上彼此相關的特定樣式變化。此外,您也可以使用相同的樣式 (或類似樣式),設定頁面或 UI 中每個鍵盤焦點項目的樣式。
在不屬於佈景主題一部分的個別控制項樣式上設定 FocusVisualStyle 並不是焦點視覺化樣式的預期用法。這是因為控制項間不一致的視覺化行為可能會混淆鍵盤焦點的相關使用者經驗。如果要刻意讓佈景主題包含不一致的鍵盤焦點控制項相關行為,最好的做法是在樣式中使用個別輸入狀態屬性的觸發程序 (Trigger),例如 IsFocused 或 IsKeyboardFocused。
焦點視覺化樣式是鍵盤焦點專用的樣式。因此,焦點樣式是一種協助工具功能。如果您想變更任何一種焦點的 UI,不論是透過滑鼠、鍵盤或程式設計方式,您都不應該使用焦點視覺化樣式;您應該改成在樣式或樣板中使用在諸如 IsFocused 或 IsFocusWithin 等一般焦點屬性的值中作用的 setter 或觸發程式。
如何建立焦點視覺化樣式
您為焦點視覺化樣式建立的樣式應該永遠都有 Control 的 TargetType。這個樣式主要應該是由 ControlTemplate 組成。您不會將目標型別指定成將焦點視覺化樣式指派為 FocusVisualStyle 的型別。
因為目標型別一定是 Control,所以您必須使用所有控制項通用的屬性來設定樣式 (使用 Control 類別及其基底類別)。您所建立的樣板應該能夠正確重疊在 UI 項目上,而且不會遮住控制項的功能區域。通常這代表視覺化回應應該會出現在控制項邊界之外,或是顯示成暫時性或不顯眼的效果,而這種效果並不會妨礙已套用焦點視覺化樣式之控制項的點擊測試 (Hit Testing)。可以在樣板繫結中使用,而且有助於判斷重疊樣板大小和位置的屬性包括 ActualHeight、ActualWidth、Margin 和 Padding。
使用焦點視覺化樣式的替代方案
針對不適合使用焦點視覺化樣式的情況 (因為您只要設定單一控制項或是希望對控制項樣板擁有更大的控制權),另外還有許多可存取的屬性和技巧可以建立回應焦點變更的視覺化行為。
觸發程式、setter 和事件全都會在設定樣式和範本中詳加討論。路由事件處理的相關討論則包含在路由事件概觀中。
IsKeyboardFocused
如果您對鍵盤焦點特別有興趣,IsKeyboardFocused 相依性屬性可用於屬性 Trigger。定義單一控制項專屬且視覺上可能與其他控制項之鍵盤焦點行為不同的特殊鍵盤焦點行為時,較適當的方法是在樣式或樣板中使用屬性觸發程式。
另一個類似的相依性屬性是 IsKeyboardFocusWithin;如果您想在複合 (Compositing) 內或控制項的功能區域內某個位置以視覺方式呼叫該鍵盤焦點,則使用這個相依性屬性或許非常恰當。例如,您可以放置 IsKeyboardFocusWithin 觸發程式,讓群組數個控制項的面板顯示不同的外觀,即使鍵盤焦點更精確的位置可能是在該面板內的個別項目上。
您也可以使用 GotKeyboardFocus 和 LostKeyboardFocus 事件 (以及其預覽對等項)。您可以使用這些事件做為 EventSetter 的基礎,也可以在程式碼後置 (Code-Behind) 中撰寫這些事件的處理常式。
其他焦點屬性
如果您希望變更焦點的所有可能原因都會產生視覺化的行為,則 setter 和觸發程式依據的基礎應該是 IsFocused 相依性屬性,或是用於 EventSetter 的 GotFocus 或 LostFocus 事件。