ControlTemplate Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Określa strukturę wizualizacji i aspekty behawioralne Control, które mogą być współużytkowane przez wiele wystąpień kontrolki.
public ref class ControlTemplate : System::Windows::FrameworkTemplate
[System.Windows.Localizability(System.Windows.LocalizationCategory.None, Readability=System.Windows.Readability.Unreadable)]
[System.Windows.Markup.DictionaryKeyProperty("TargetType")]
public class ControlTemplate : System.Windows.FrameworkTemplate
[<System.Windows.Localizability(System.Windows.LocalizationCategory.None, Readability=System.Windows.Readability.Unreadable)>]
[<System.Windows.Markup.DictionaryKeyProperty("TargetType")>]
type ControlTemplate = class
inherit FrameworkTemplate
Public Class ControlTemplate
Inherits FrameworkTemplate
- Dziedziczenie
- Atrybuty
Przykłady
Poniżej przedstawiono ButtonStyle ustawiającą ControlTemplateButton:
<Style TargetType="Button">
<!--Set to true to not get any properties from the themes.-->
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"/>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Po zastosowaniu tego Button jest wyświetlana jako Ellipse:
Po ustawieniu właściwości TemplateControl na nową ControlTemplate, jak w powyższym przykładzie, zastępujesz cały szablon. To, jak wygląda Button, gdy znajduje się w fokusie lub naciśnięciu, jest częścią domyślnego wyglądu przycisku, który zastępujesz. W związku z tym, w zależności od potrzeb, możesz umieścić w definicji, jak powinien wyglądać przycisk po naciśnięciu i tak dalej, jak w poniższym przykładzie:
<Style TargetType="Button">
<Setter Property="SnapsToDevicePixels"
Value="true" />
<Setter Property="OverridesDefaultStyle"
Value="true" />
<Setter Property="FocusVisualStyle"
Value="{StaticResource ButtonFocusVisual}" />
<Setter Property="MinHeight"
Value="23" />
<Setter Property="MinWidth"
Value="75" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border TextBlock.Foreground="{TemplateBinding Foreground}"
x:Name="Border"
CornerRadius="2"
BorderThickness="1">
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="{DynamicResource BorderLightColor}"
Offset="0.0" />
<GradientStop Color="{DynamicResource BorderDarkColor}"
Offset="1.0" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.BorderBrush>
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1"
StartPoint="0.5,0">
<GradientStop Color="{DynamicResource ControlLightColor}"
Offset="0" />
<GradientStop Color="{DynamicResource ControlMediumColor}"
Offset="1" />
</LinearGradientBrush>
</Border.Background>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5" />
<VisualTransition GeneratedDuration="0"
To="Pressed" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource ControlMouseOverColor}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource ControlPressedColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
(GradientBrush.GradientStops)[0].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource PressedBorderDarkColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource PressedBorderLightColor}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource DisabledControlDarkColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource DisabledForegroundColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).
(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{StaticResource DisabledBorderDarkColor}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter Margin="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RecognizesAccessKey="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefault"
Value="true">
<Setter TargetName="Border"
Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="{DynamicResource DefaultBorderBrushLightBrush}"
Offset="0.0" />
<GradientStop Color="{DynamicResource DefaultBorderBrushDarkColor}"
Offset="1.0" />
</GradientStopCollection>
</GradientBrush.GradientStops>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Zwróć uwagę, że w tym przykładzie odwołuje się do zasobów, które nie są tutaj wyświetlane. Aby zapoznać się z kompletnym przykładem, zobacz Styling with ControlTemplates Sample (Przykład ControlTemplates). Ten przykład zawiera przykłady szablonów kontrolek dla wielu kontrolek i jest najlepszym sposobem na rozpoczęcie tworzenia szablonów kontrolek.
Uwagi
ControlTemplate umożliwia określenie struktury wizualnej kontrolki. Autor kontrolki może zdefiniować domyślną ControlTemplate, a autor aplikacji może zastąpić ControlTemplate w celu odtworzenia struktury wizualnej kontrolki.
Tworzenie szablonów kontroli jest jedną z wielu funkcji oferowanych przez model stylów I szablonów WPF. Model stylów i tworzenia szablonów zapewnia tak dużą elastyczność, że w wielu przypadkach nie trzeba pisać własnych kontrolek. Jeśli jesteś autorem aplikacji, który chce zmienić wizualizację kontrolki lub zastąpić ControlTemplate istniejącej kontrolki, zobacz temat Styling and Templating temat, aby zapoznać się z przykładami i dogłębną dyskusją.
Jeśli piszesz własną kontrolkę, zobacz sekcję "Create a Custom Control" (Tworzenie niestandardowej kontrolki) w Control Authoring Overview (Omówienie tworzenia kontrolek).
ControlTemplate jest przeznaczona do samodzielnej jednostki szczegółów implementacji, która jest niewidoczna dla użytkowników zewnętrznych i obiektów, w tym stylów. Jedynym sposobem manipulowania zawartością szablonu kontrolki jest z poziomu tego samego szablonu kontrolki.
Użycie elementu właściwości XAML
<ControlTemplate>
<VisualTreeRootNode>
VisualTreeNodeContents
</VisualTreeRootNode>
</ControlTemplate>
Wartości XAML
element ControlTemplate Object dla ControlTemplate lub klasy pochodnej.
VisualTreeRootNode pojedynczy element XAML jako bezpośredni element podrzędny ControlTemplate (lub klasy pochodnej). Szablony muszą mieć jeden węzeł główny. Aby wygenerować przydatny szablon, należy oczekiwać, że element wybrany jako VisualTreeRootNode obsługuje własny model zawartości, często model obsługujący wiele elementów podrzędnych.
VisualTreeNodeContents co najmniej jeden element, który ukończy zamierzony szablon. Jeśli element wybrany jako VisualTreeRootNode obsługuje tylko jedno element podrzędny, może istnieć tylko jeden element zadeklarowany jako VisualTreeNodeContents. Jeśli wybrana VisualTreeRootNode obsługuje właściwość zawartości tekstowej, jest również możliwa (choć nietypowa).
Konstruktory
ControlTemplate() |
Inicjuje nowe wystąpienie klasy ControlTemplate. |
ControlTemplate(Type) |
Inicjuje nowe wystąpienie klasy ControlTemplate z określonym typem docelowym. |
Właściwości
Dispatcher |
Pobiera Dispatcher jest skojarzony z tym DispatcherObject. (Odziedziczone po DispatcherObject) |
HasContent |
Pobiera wartość wskazującą, czy ten szablon ma zoptymalizowaną zawartość. (Odziedziczone po FrameworkTemplate) |
IsSealed |
Pobiera wartość wskazującą, czy ten obiekt jest w stanie niezmiennym, więc nie można go zmienić. (Odziedziczone po FrameworkTemplate) |
Resources |
Pobiera lub ustawia kolekcję zasobów, które mogą być używane w zakresie tego szablonu. (Odziedziczone po FrameworkTemplate) |
TargetType |
Pobiera lub ustawia typ, dla którego jest przeznaczona ta ControlTemplate. |
Template |
Pobiera lub ustawia odwołanie do obiektu, który rejestruje lub odtwarza węzły XAML dla szablonu, gdy szablon jest zdefiniowany lub stosowany przez składnik zapisywania. (Odziedziczone po FrameworkTemplate) |
Triggers |
Pobiera kolekcję obiektów TriggerBase, które stosują zmiany właściwości lub wykonują akcje na podstawie określonych warunków. |
VisualTree |
Pobiera lub ustawia węzeł główny szablonu. (Odziedziczone po FrameworkTemplate) |
Metody
CheckAccess() |
Określa, czy wątek wywołujący ma dostęp do tego DispatcherObject. (Odziedziczone po DispatcherObject) |
Equals(Object) |
Określa, czy określony obiekt jest równy bieżącemu obiektowi. (Odziedziczone po Object) |
FindName(String, FrameworkElement) |
Znajduje element skojarzony z określoną nazwą zdefiniowaną w tym szablonie. (Odziedziczone po FrameworkTemplate) |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Pobiera Type bieżącego wystąpienia. (Odziedziczone po Object) |
LoadContent() |
Ładuje zawartość szablonu jako wystąpienie obiektu i zwraca element główny zawartości. (Odziedziczone po FrameworkTemplate) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Object. (Odziedziczone po Object) |
RegisterName(String, Object) |
Rejestruje nową parę nazw/obiektów w bieżącym zakresie nazw. (Odziedziczone po FrameworkTemplate) |
Seal() |
Blokuje szablon, aby nie można go było zmienić. (Odziedziczone po FrameworkTemplate) |
ShouldSerializeResources(XamlDesignerSerializationManager) |
Zwraca wartość wskazującą, czy procesy serializacji powinny serializować wartość właściwości Resources w wystąpieniach tej klasy. (Odziedziczone po FrameworkTemplate) |
ShouldSerializeVisualTree() |
Zwraca wartość wskazującą, czy procesy serializacji powinny serializować wartość właściwości VisualTree w wystąpieniach tej klasy. (Odziedziczone po FrameworkTemplate) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
UnregisterName(String) |
Usuwa mapowanie nazw/obiektów z zakresu nazw XAML. (Odziedziczone po FrameworkTemplate) |
ValidateTemplatedParent(FrameworkElement) |
Sprawdza szablon elementu nadrzędnego względem zestawu reguł. |
VerifyAccess() |
Wymusza, że wątek wywołujący ma dostęp do tego DispatcherObject. (Odziedziczone po DispatcherObject) |
Jawne implementacje interfejsu
INameScope.FindName(String) |
Zwraca obiekt, który ma podaną nazwę identyfikującą. (Odziedziczone po FrameworkTemplate) |
IQueryAmbient.IsAmbientPropertyAvailable(String) |
Kwerenda, czy określona właściwość otoczenia jest dostępna w bieżącym zakresie. (Odziedziczone po FrameworkTemplate) |