Compartilhar via


Chamar e substituir seu tipo de base com C++/WinRT

Importante

Para ver conceitos e termos essenciais que ajudam a entender como utilizar e criar classes de runtime com C++/WinRT, confira Utilizar APIs com C++/WinRT e Criar APIs com C++/WinRT.

Como implementar funções substituíveis, como MeasureOverride e OnApplyTemplate

Há alguns pontos de extensão em XAML que seu aplicativo pode conectar, por exemplo:

É possível derivar um controle personalizado da classe de runtime Control, que por si só deriva de classes básicas de runtime. E há métodos overridable de Control, FrameworkElement e UIElement, que você pode substituir em sua classe derivada. Aqui está um exemplo de código mostrando como você pode fazer isso.

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 { ... };
...
};

Métodos substituíveis apresentam-se diferentemente em projeções de linguagem diferentes. Em C#, por exemplo, os métodos substituíveis normalmente são exibidos como métodos virtuais protegidos. Em C++/WinRT, elas não são virtuais nem protegidas, mas é possível substituí-las e fornecer sua própria implementação, conforme mostrado acima.

Se você estiver substituindo um desses métodos que podem ser substituídos no C++/WinRT, sua runtimeclass IDL não declarará o método. Para obter mais informações sobre a sintaxe base_type mostrada, confira a próxima seção neste tópico (Chamar seu tipo 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);
        }
    };
}

Chamar seu tipo de base

Você pode acessar seu tipo de base e chamar métodos nele usando o alias de tipo base_type. Vimos um exemplo disso na seção anterior; mas você pode usar base_type para acessar qualquer membro da classe base (não apenas métodos substituídos). Veja um exemplo:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

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

APIs importantes