Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Основные понятия и термины, которые поддерживают понимание использования и разработки классов среды выполнения с помощью C++/WinRT, см. в статье "Использование API с помощью C++/WinRT и разработки API с помощью C++/WinRT".
Реализация переопределиваемых методов, таких как MeasureOverride и OnApplyTemplate
В XAML есть некоторые точки расширения, к которым может подключаться приложение, например:
Вы создаёте пользовательский элемент управления на основе класса времени выполнения Control, который, в свою очередь, наследуется от базовых классов времени выполнения. Существуют overridable методы Control, FrameworkElement и UIElement , которые можно переопределить в производном классе. Вот пример кода, показывающий, как это сделать.
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 { ... };
...
};
Переопределимые методы представляют себя по-разному в разных проекциях языка. Например, в C# методы, которые можно переопределить, обычно объявляются как protected virtual methods. В C++/WinRT они не являются ни виртуальными, ни защищёнными, но вы всё равно можете переопределить их и предоставить собственную реализацию, как показано выше.
Если вы переопределяете один из этих переопределяемых методов в C++/WinRT, то IDL runtimeclass не должен объявлять этот метод. Дополнительные сведения о синтаксисе base_type, показанном здесь, см. в следующем разделе этой статьи (Вызов базового типа).
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);
}
};
}
Вызов базового типа
Вы можете получить доступ к базовому типу и вызывать его методы, используя псевдоним типа base_type. Мы видели пример этого в предыдущем разделе; но вы можете использовать base_type для доступа к любому члену базового класса (а не только переопределенным методам). Приведем пример:
struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
...
void Foo()
{
// Call my base type's Bar method.
base_type::Bar();
}
};
Важные API
Windows developer