Appel et substitution de votre type de base avec C++/WinRT
Important
Pour obtenir les principaux concepts et termes facilitant votre compréhension pour utiliser et créer des classes runtime avec C++/WinRT, voir Utiliser des API avec C++/WinRT et Créer des API avec C++/WinRT.
Implémentation de fonctions remplaçables, comme MeasureOverride et OnApplyTemplate
Il existe des points d’extension en XAML auxquels votre application peut se connecter, par exemple :
Vous dérivez un contrôle personnalisé de la classe de runtime Control, qui elle-même dérive des classes de runtime de base. Et il existe des méthodes overridable
de Control, de FrameworkElement et de UIElement que vous pouvez remplacer dans votre classe dérivée. Voici un exemple de code illustrant comment procéder.
struct BgLabelControl : BgLabelControlT<BgLabelControl>
{
...
// Control overrides.
void OnPointerPressed(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& /* e */) const { ... };
// FrameworkElement overrides.
Windows::Foundation::Size MeasureOverride(Windows::Foundation::Size const& /* availableSize */) const { ... };
void OnApplyTemplate() const { ... };
// UIElement overrides.
Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer() const { ... };
...
};
Les fonctions remplaçables se présentent différemment dans les projections des différents langages. Par exemple en C#, les fonctions remplaçables apparaissent généralement sous forme de fonctions virtuelles protégées. En C++/WinRT, elles ne sont ni protégées ni virtuelles, mais vous pouvez quand même les remplacer et fournir votre propre implémentation, comme indiqué ci-dessus.
Si vous remplacez une de ces méthodes remplaçables dans C++/WinRT, votre IDL runtimeclass
ne doit pas déclarer la méthode. Pour plus d’informations sur la syntaxe base_type
affichée, consultez la section suivante de cette rubrique (Appel de votre type de base).
IDL
namespace Example
{
runtimeclass CustomVSM : Windows.UI.Xaml.VisualStateManager
{
CustomVSM();
// note that we don't declare GoToStateCore here
}
}
C++/WinRT
namespace winrt::Example::implementation
{
struct CustomVSM : CustomVSMT<CustomVSM>
{
CustomVSM() {}
bool GoToStateCore(winrt::Windows::UI::Xaml::Controls::Control const& control, winrt::Windows::UI::Xaml::FrameworkElement const& templateRoot, winrt::hstring const& stateName, winrt::Windows::UI::Xaml::VisualStateGroup const& group, winrt::Windows::UI::Xaml::VisualState const& state, bool useTransitions) {
return base_type::GoToStateCore(control, templateRoot, stateName, group, state, useTransitions);
}
};
}
Appel de votre type de base
Vous pouvez accéder à votre type de base et appeler des méthodes sur celui-ci à l’aide de l’alias de type base_type
. Nous avons vu un exemple de ceci dans la section précédente ; mais vous pouvez utiliser base_type
pour accéder à n’importe quel membre de classe de base (pas seulement les méthodes substituées). Voici un exemple :
struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
...
void Foo()
{
// Call my base type's Bar method.
base_type::Bar();
}
};