Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Sie können mithilfe der Funktionen winrt::box_value und winrt::unbox_value nicht nur skalare Werte, sondern auch die meisten Arten von Arrays verpacken und entpacken (mit Ausnahme von Arrays von Enumerationen). Sie können nur skalare Werte mithilfe der Funktion winrt::unbox_value_or entpacken.
Die IInspectable-Schnittstelle ist die Stammschnittstelle jeder Laufzeitklasse im Windows-Runtime (WinRT). Dies ist eine analoge Idee zu IUnknown , die sich an der Wurzel jeder COM-Schnittstelle und -Klasse befindet; und System.Object befindet sich im Stamm jeder allgemeinen Typsystemklasse .
Mit anderen Worten, einer Funktion, die IInspectable erwartet, kann eine Instanz einer beliebigen Runtimeklasse übergeben werden. Sie können jedoch weder direkt an eine solche Funktion einen skalaren Wert (z. B. einen numerischen oder Textwert) noch ein Array übergeben. Stattdessen muss ein Skalar- oder Arraywert in ein Referenzklassenobjekt eingeschlossen werden. Dieser Vorgang wird als Boxing eines Werts bezeichnet.
Important
Sie können jeden beliebigen Typ, den Sie an eine Windows-Runtime-API übergeben können, einem Boxing und Unboxing unterziehen. Mit anderen Worten, ein Typ der Windows-Runtime. Numerische und Textwerte (Zeichenfolgen) und Arrays sind einige Beispiele oben aufgeführt. Ein weiteres Beispiel ist ein struct, das Sie in IDL definieren. Wenn Sie versuchen, ein normales C++ struct zu boxen (eines, das nicht in IDL definiert ist), weist Sie der Compiler darauf hin, dass Sie nur einen Windows-Runtime-Typ boxen können. Eine Laufzeitklasse ist ein Windows-Runtime-Typ, aber Sie können Laufzeitklassen natürlich an Windows-Runtime-APIs übergeben, ohne sie zu boxen.
C++/WinRT stellt die winrt::box_value-Funktion bereit, die einen Skalar- oder Arraywert als Argument entgegennimmt und den in ein IInspectable verpackten Wert zurückgibt. Zum Entpacken eines IInspectable wieder in einen Skalar- oder Arraywert gibt es die Funktion winrt::unbox_value. Zum Entpacken eines IInspectable wieder in einen skalaren Wert gibt es auch die Funktion winrt::unbox_value_or.
Beispiele für das Boxen eines Werts
Die LaunchActivatedEventArgs:: Arguments-Accessorfunktion gibt einen winrt::hstring zurück, der ein skalarer Wert ist. Wir können diesen hstring-Wert in ein Objekt kapseln und ihn wie folgt an eine Funktion übergeben, die IInspectable erwartet.
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
...
rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));
...
}
Um die Inhaltseigenschaft einer XAML-Schaltfläche festzulegen, rufen Sie die Funktion Button::Content mutator auf. Um die Inhaltseigenschaft auf einen Zeichenfolgenwert festzulegen, können Sie diesen Code verwenden.
Button().Content(winrt::box_value(L"Clicked"));
Zuerst wandelt der hstring-Konvertierungskonstruktor das Zeichenfolgenliteral in ein hstring um. Anschließend wird die Überladung von winrt::box_value aufgerufen, die eine Hstring-Zeichenfolge akzeptiert.
Beispiele für das Entpacken einer IInspectable-Instanz
In Ihren eigenen Funktionen, die IInspectable erwarten, können Sie winrt::unbox_value verwenden, um den Wert zu entpacken, und Sie können winrt::unbox_value_or verwenden, um den Wert mit einem Standardwert zu entpacken. Sie können auch try_as verwenden, um in ein std::optional zu entpacken.
void Unbox(winrt::Windows::Foundation::IInspectable const& object)
{
hstring hstringValue = unbox_value<hstring>(object); // Throws if object is not a boxed string.
hstringValue = unbox_value_or<hstring>(object, L"Default"); // Returns L"Default" if object is not a boxed string.
float floatValue = unbox_value_or<float>(object, 0.f); // Returns 0.0 if object is not a boxed float.
std::optional<int> optionalInt = object.try_as<int>(); // Returns std::nullopt if object is not a boxed int.
}
Bestimmen des Typs eines Feldwerts
Wenn Sie einen verpackten Wert erhalten und nicht sicher sind, welchen Typ er enthält (Sie müssen seinen Typ kennen, um ihn zu entpacken), können Sie die IPropertyValue-Schnittstelle des verpackten Werts abfragen und dann darauf Type aufrufen. Hier ist ein Codebeispiel.
WINRT_ASSERT ist eine Makrodefinition und wird auf _ASSERTE erweitert.
float pi = 3.14f;
auto piInspectable = winrt::box_value(pi);
auto piPropertyValue = piInspectable.as<winrt::Windows::Foundation::IPropertyValue>();
WINRT_ASSERT(piPropertyValue.Type() == winrt::Windows::Foundation::PropertyType::Single);
Wichtige APIs
Windows developer