Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anmärkning
Du kan boxa och avboxa inte bara skalära värden, men även de flesta typer av arrayer (med undantag för arrayer av uppräkningar) med hjälp av funktionerna winrt::box_value och winrt::unbox_value. Du kan packa upp endast skalärvärden med hjälp av funktionen winrt::unbox_value_or.
Det IInspectable-gränssnittet är grundgränssnittet för varje runtime-klass i Windows Runtime (WinRT). Detta är en liknande idé där IUnknown är roten för varje COM-gränssnitt och -klass, och där System.Object är roten för varje klass i det gemensamma typsystemet.
Med andra ord kan en funktion som förväntar sig IInspectable skickas en instans av valfri körningsklass. Men du kan inte direkt skicka till en sådan funktion ett skalärt värde (till exempel ett numeriskt värde eller textvärde) eller en matris. I stället måste ett skalärt värde eller matrisvärde omslutas i ett referensklassobjekt. Den omslutningsprocessen kallas boxning värdet.
Viktigt!
Du kan boxa och avboxa vilken typ som helst som du kan skicka till ett Windows Runtime-API. Med andra ord en Windows Runtime-typ. Numeriska värden och textvärden (strängar) och matriser är några exempel som anges ovan. Ett annat exempel är ett struct som du definierar i IDL. Om du försöker boxa en vanlig C++ struct (en som inte har definierats i IDL) påminner kompilatorn dig om att du bara kan ange en Windows Runtime-typ. En runtimeklass är en Windows Runtime-typ, men du kan naturligtvis skicka runtimeklasser till Windows Runtime-API:er utan att omvandla dem till objekt.
C++/WinRT- tillhandahåller funktionen winrt::box_value, som tar ett skalärt värde eller matrisvärde, och returnerar värdet inslaget i en IInspectable-. Om du vill packa upp en IInspectable till ett skalärt eller ett array-värde finns funktionen winrt::unbox_value. För att avboxa en IInspectable- till ett skalärt värde finns det också funktionen winrt::unbox_value_or.
Exempel på boxning av ett värde
Funktionen LaunchActivatedEventArgs::Argument-accessor returnerar en winrt::hstring, vilket är ett skalärt värde. Vi kan ange att hstring värde och skicka det till en funktion som förväntar sig IInspectable så här.
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
...
rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));
...
}
Om du vill ange innehållsegenskapen för en XAML-knapp anropar du funktionen Button::Content mutator. Om du vill ange innehållsegenskapen till ett strängvärde kan du använda den här koden.
Button().Content(winrt::box_value(L"Clicked"));
Först konverterar konverteringskonstruktorn hstring strängliteralen till en hstring. Sedan anropas överlagringen av winrt::box_value som tar en hstring.
Exempel på att avboxa en IInspectable
I dina egna funktioner som förväntar sig IInspectablekan du använda winrt::unbox_value för att avboxa, och du kan använda winrt::unbox_value_or för att avboxa med ett standardvärde. Du kan också använda try_as för att packa upp till en std::optional.
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.
}
Fastställa typen av ett rutat värde
Om du får ett boxat värde och du är osäker på vilken typ det innehåller (du måste känna till dess typ för att packa upp det) kan du undersöka det boxade värdet för dess IPropertyValue--gränssnitt och sedan anropa Typ på det. Här är ett kodexempel.
WINRT_ASSERT är en makrodefinition och expanderas till _ASSERTE.
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);