Invocar e redefinir o tipo base com C++/WinRT

Important

Para conceitos e termos essenciais que apoiam a sua compreensão de como consumir e criar classes de runtime com C++/WinRT, veja Consume APIs with C++/WinRT e Author APIs with C++/WinRT.

Implementação de métodos substituíveis, como MeasureOverride e OnApplyTemplate

Existem alguns pontos de extensão em XAML aos quais a sua aplicação se pode ligar, por exemplo:

Deriva-se um controlo personalizado a partir da classe de runtime Control , que por sua vez deriva ainda mais das classes base. E existem overridable métodos de Control, FrameworkElement e UIElement que podes sobrepor na tua classe derivada. Este é um exemplo de código que lhe mostra como fazer isso.

struct BgLabelControl : BgLabelControlT<BgLabelControl>
{
...
    // Control overrides.
    void OnPointerPressed(Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& /* e */) const { ... };

    // FrameworkElement overrides.
    Windows::Foundation::Size MeasureOverride(Windows::Foundation::Size const& /* availableSize */) const { ... };
    void OnApplyTemplate() const { ... };

    // UIElement overrides.
    Microsoft::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer() const { ... };
...
};

Métodos substituíveis apresentam-se de forma diferente em diferentes projeções de linguagem. Em C#, por exemplo, os métodos que podem ser substituídos surgem normalmente como métodos virtuais protegidos. Em C++/WinRT, eles não são virtuais nem protegidos, mas você ainda pode substituí-los e fornecer sua própria implementação, como mostrado acima.

Se estiver a substituir um destes métodos substituíveis em C++/WinRT, o método não pode ser declarado no ficheiro runtimeclass IDL. Para mais informações sobre a sintaxe base_type apresentada, consulte a secção seguinte neste tópico (Chamar ao seu tipo base).

IDL

namespace Example
{
    runtimeclass CustomVSM : Microsoft.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::Microsoft::UI::Xaml::Controls::Control const& control, winrt::Microsoft::UI::Xaml::FrameworkElement const& templateRoot, winrt::hstring const& stateName, winrt::Microsoft::UI::Xaml::VisualStateGroup const& group, winrt::Microsoft::UI::Xaml::VisualState const& state, bool useTransitions) {
            return base_type::GoToStateCore(control, templateRoot, stateName, group, state, useTransitions);
        }
    };
}

Chamar o seu tipo base

Pode aceder ao seu tipo base e chamar métodos nele, usando o tipo alias base_type. Vimos um exemplo disto na secção anterior; Mas podes usar base_type para aceder a qualquer membro da classe base (não apenas métodos sobrepostos). Eis um exemplo:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

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

APIs importantes