Condividi tramite


Chiamare ed eseguire l'override del tipo di base con C++/WinRT

Importante

Per i concetti essenziali e i termini che possono aiutarti a comprendere come usare e creare classi di runtime con C++/WinRT, vedi Usare API con C++/WinRT e Creare API con C++/WinRT.

Implementazione di metodi sottoponibili a override come MeasureOverride e OnApplyTemplate

Sono presenti alcuni punti di estensione in XAML a cui la tua applicazione può connettersi, ad esempio:

I controlli personalizzati si derivano dalla classe di runtime Control che a sua volta deriva da classi di runtime di base. E sono presenti overridable metodi di Controllo, FrameworkElement e UIElement di cui puoi eseguire l'override nella classe derivata. Ecco un esempio di codice che illustra come fare.

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

I metodi sottoponibili a override sono diversi nelle proiezioni di linguaggi diversi. In C#, ad esempio, i metodi sottoponibili a override si presentano tipicamente come metodi virtuali protetti. In C++/WinRT non sono né virtuali né protette, ma è comunque possibile eseguirne l'override e fornire la propria implementazione, come illustrato in precedenza.

Se si sta eseguendo l'override di uno di questi metodi di cui è possibile eseguire l'override in C++/WinRT, l'runtimeclassIDL non deve dichiarare il metodo. Per altre informazioni sulla sintassi base_type mostrata, vedere la sezione successiva in questo argomento (Chiamare il tipo di 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);
        }
    };
}

Chiamare il tipo di base

È possibile accedere al tipo di base e chiamare i metodi su di esso usando alias di tipo base_type. Abbiamo visto un esempio di questo nella sezione precedente; ma è possibile usare base_type per accedere a qualsiasi membro della classe di base (non solo metodi sottoposti a override). Ecco un esempio:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

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

API importanti