Zabalení a rozbalení hodnot do IInspectable pomocí C++/WinRT

Note

Pomocí funkcí winrt::box_value a winrt::unbox_value můžete pole vyřadit a rozbalit nejen skalární hodnoty, ale také většinu druhů polí (s výjimkou polí výčtů). Pomocí funkce winrt::unbox_value_or můžete rozbalit pouze skalární hodnoty.

Rozhraní IInspectable je kořenovým rozhraním všech běhových tříd ve prostředí Windows Runtime (WinRT). Jde o obdobnou myšlenku, jako když IUnknown stojí v základu každého rozhraní a třídy COM a System.Object stojí v základu každé třídy Common Type System.

Jinými slovy, funkci, která očekává parametr typu IInspectable, lze předat instanci jakékoli třídy modulu runtime. Do takové funkce ale nemůžete přímo předat skalární hodnotu (například číselnou nebo textovou hodnotu) ani pole. Místo toho musí být skalární nebo maticová hodnota zabalena uvnitř objektu referenční třídy. Tento proces zabalení se označuje jako zabalení hodnoty.

Důležité

Libovolný typ, který můžete předat do rozhraní API systému prostředí Windows Runtime, můžete boxovat i unboxovat. Jinými slovy, typ prostředí Windows Runtime. Číselné a textové hodnoty (řetězce) a matice jsou některé příklady uvedené výše. Dalším příkladem je struct to, co definujete v IDL. Pokud se pokusíte zabalit běžný typ C++ struct (takový, který není definován v IDL), kompilátor vám připomene, že zabalit můžete pouze typ prostředí Windows Runtime. Třída runtime je typ prostředí Windows Runtime, ale samozřejmě můžete třídy runtime předávat rozhraním API systému prostředí Windows Runtime, aniž byste je museli boxovat.

C++/WinRT poskytuje funkci winrt::box_value, která přijímá skalární hodnotu nebo pole a vrací hodnotu zabalenou do objektu IInspectable. Pro rozbalení objektu IInspectable zpět na skalární hodnotu nebo hodnotu pole slouží funkce winrt::unbox_value. Pro rozbalení IInspectable zpět do skalární hodnoty existuje také winrt::unbox_value_or funkce.

Příklady boxování hodnoty

Funkce LaunchActivatedEventArgs::Arguments accessor vrátí winrt::hstring, což je skalární hodnota. Tuto hodnotu typu hstring můžeme zabalit a předat ji funkci, která očekává IInspectable, takto.

void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
    ...
    rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));
    ...
}

Pokud chcete nastavit vlastnost obsahu tlačítka XAML, zavoláte funkci Button::Content mutator. K nastavení vlastnosti obsahu na řetězcovou hodnotu můžete použít tento kód.

Button().Content(winrt::box_value(L"Clicked"));

Nejprve převodní konstruktor hstring převede řetězcový literál na typ hstring. Pak je zavoláno přetížení winrt::box_value, které přijímá parametr typu hstring.

Příklady rozbalení objektu IInspectable

Ve svých vlastních funkcích, které očekávají IInspectable, můžete použít winrt::unbox_value k rozbalení a můžete použít winrt::unbox_value_or k rozbalení s výchozí hodnotou. K rozbalení složky std::optional můžete také použít try_as.

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

Určení typu krabicové hodnoty

Pokud obdržíte zabalenou hodnotu a nejste si jisti, jaký typ obsahuje (abyste ji mohli rozbalit, potřebujete znát její typ), můžete se zabalené hodnoty dotázat na její rozhraní IPropertyValue a poté na něm zavolat Type. Tady je příklad kódu.

WINRT_ASSERT je definice makra a rozbalí se na _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);

Důležitá rozhraní API