先決條件
我們假設您可以將控制項新增至 UI、設定其屬性,以及附加事件處理常式。 如需將控制項新增至應用程式的指示,請參閱 新增控制項和處理事件。 我們也假設您知道如何透過建立預設範本的複本並進行編輯來定義控制項的自訂範本的基本概念。 如需詳細資訊,請參閱 控制項範本。
TemplateSettings 類別的案例
TemplateSettings 類別提供一組屬性,當您為控制項定義新的控制項範本時會使用這些屬性。 屬性具有一些像素測量值,例如某些 UI 元素部件的大小。 這些值有時是來自控制邏輯的計算值,通常不容易覆寫甚至存取。 某些屬性被設計為控制元件轉換和動畫的 From 和 To 值,因此相關的 TemplateSettings 屬性是成對出現的。
有數個 TemplateSettings 類別。 所有項目都在 .Xaml.Controls.Primitives 名稱空間。 每個類別在相關控制項上都有相關聯的 TemplateSettings 屬性。 此 TemplateSettings 屬性是您存取控制項的 TemplateSettings 值的方式,並可以建立範本繫結至其屬性。
以下是相關類別和屬性的一些範例:
- ComboBoxTemplateSettings:ComboBox.TemplateSettings 的值
- GridViewItemTemplateSettings:GridViewItem.TemplateSettings 的值
- ListViewItemTemplateSettings:ListViewItem.TemplateSettings 的值
- ToggleSwitchTemplateSettings:ToggleSwitch.TemplateSettings 的值
- ToolTipTemplateSettings:ToolTip.TemplateSettings 的值
TemplateSettings 屬性一律要用於 XAML,而不是程式碼。 它們是父層控制項的唯讀TemplateSettings屬性的唯讀子屬性。 針對進階自訂控制項案例,您要建立新的 Control 型類別,因此可能會影響控制項邏輯,請考慮在控制項上定義自訂 TemplateSettings 屬性,以傳達可能對重新範本化控制項之任何人有用的資訊。 作為該屬性的唯讀值,請定義與控制項相關的新 TemplateSettings 類別,該類別具有與範本測量、動畫定位等相關的每個資訊項目的唯讀屬性,並為呼叫端提供使用控制項邏輯初始化的該類別的執行階段實例。 TemplateSettings 類別衍生自 DependencyObject,讓屬性可以使用相依性屬性系統來進行屬性變更的回呼。 不會將屬性的相依性識別碼公開為公用 API,因為 TemplateSettings 屬性是供呼叫端唯讀使用的。
如何在控制項範本中使用 TemplateSettings
以下是來自起始預設 XAML 控制項範本的範例。 特定的預設模板來自 ProgressRing。
<Ellipse
x:Name="E1"
Style="{StaticResource ProgressRingEllipseStyle}"
Width="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Height="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseOffset}"
Fill="{TemplateBinding Foreground}"/>
ProgressRing 範本的完整 XAML 有數百行,因此這只是一個很小的摘錄。 此 XAML 會定義控制項組件,該元件是 6 個 橢圓 元素之一,可描繪不確定進度的旋轉動畫。 身為開發人員,您可能不喜歡圓圈,而且可能會使用不同的圖形基本類型或不同的基本形狀來進行動畫的進度。 例如,您可以撰寫 ProgressRing ,以改為使用一組排列在正方形中的 Rectangle 元素。 如果是這樣,新範本的每個個別 矩形 元件可能如下所示:
<Rectangle
x:Name="R1"
Width="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Height="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseDiameter}"
Margin="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.EllipseOffset}"
Fill="{TemplateBinding Foreground}"/>
TemplateSettings 屬性在這裡有用的原因是,它們是來自 ProgressRing 基本控制項邏輯的計算值。 計算會分割 ProgressRing 的整體 ActualWidth 和 ActualHeight,並為其範本中的每個運動元素配置計算度量,讓範本零件可以調整內容大小。
以下是預設 XAML 控制項範本的另一個使用範例,這次顯示其中一個屬性集,即動畫的 From 和 To 。 這是來自 ComboBox 預設範本:
<VisualStateGroup x:Name="DropDownStates">
<VisualState x:Name="Opened">
<Storyboard>
<SplitOpenThemeAnimation
OpenedTargetName="PopupBorder"
ContentTargetName="ScrollViewer"
ClosedTargetName="ContentPresenter"
ContentTranslationOffset="0"
OffsetFromCenter="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.DropDownOffset}"
OpenedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.DropDownOpenedHeight}"
ClosedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplateSettings.DropDownClosedHeight}" />
</Storyboard>
</VisualState>
...
</VisualStateGroup>
同樣,範本中有很多 XAML,因此我們只顯示摘錄。 這只是數個狀態和主題動畫之一,每個狀態和主題動畫都使用相同的 ComboBoxTemplateSettings 屬性。 針對 ComboBox,透過繫結使用 ComboBoxTemplateSettings 值,會強制範本中的相關動畫會在以共用值為基礎的位置停止和開始,因此會順暢轉換。
備註
當您使用 TemplateSettings 值作為控制項範本的一部分時,請確定您設定的屬性符合值的類型。 如果沒有,您可能需要建立繫結的值轉換器,以便從 TemplateSettings 值的不同來源類型轉換繫結的目標類型。 如需詳細資訊,請參閱 IValueConverter。