Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Importante
Per concetti e termini essenziali che supportano la comprensione di 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 sostituibili , ad esempio MeasureOverride e OnApplyTemplate
Esistono alcuni punti di estensione in XAML a cui l'applicazione può collegarsi, ad esempio:
Si deriva un controllo personalizzato dalla classe di runtime Control , che deriva ulteriormente dalle classi di runtime di base. Sono inoltre disponibili overridable metodi di Control, FrameworkElement e UIElement che è possibile ridefinire nella classe derivata. Ecco un esempio di codice che illustra come eseguire questa operazione.
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 { ... };
...
};
I metodi sostituibili si presentano in modo diverso in proiezioni del linguaggio diverse. In C#, ad esempio, i metodi sottoponibili a override vengono in genere visualizzati come metodi virtuali protetti. In C++/WinRT non sono né virtuali né protetti, ma è comunque possibile eseguirne l'override e fornire la propria implementazione, come illustrato in precedenza.
Se si esegue l'override di uno di questi metodi sostituibili in C++/WinRT, il file runtimeclass IDL non deve dichiarare il metodo. Per altre informazioni sulla sintassi base_type illustrata, vedi la sezione successiva in questo argomento (Come chiamare il tipo di 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);
}
};
}
Chiamare il tipo base
È possibile accedere al tipo di base e chiamarne i metodi utilizzando l'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();
}
};