Share via


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 (outre les méthodes substituées). Voici un exemple :

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

    void Foo()
    {
        // Call my base type's Bar method.
        base_type::Bar();
    }
};

API importantes