Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Pomocí funkcí winrt::box_value a winrt::unbox_value můžete nejen zabalit a rozbalit 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é rozhraní každé třídy modulu runtime v prostředí Windows Runtime (WinRT). Jedná se o analogický nápad IUnknown být kořenem každého rozhraní a třídy COM; a System.Object být kořenem každé třídy Common Type System.
Jinými slovy, funkce, která očekává IInspectable, může být předána instance 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 prostředí Windows Runtime, můžete zabalit a rozbalit. 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 zaboxovat běžný typ C++ struct (takový, který není definován v IDL), kompilátor vás upozorní, že můžete zaboxovat pouze typ Windows Runtime. Třída runtime je typ Windows Runtime, ale můžete ji samozřejmě předat API Windows Runtime bez obalování.
C++/WinRT poskytuje funkci winrt::box_value, která přebírá skalární nebo poli hodnotu a vrátí hodnotu zabalenou do IInspectable. Pro rozbalení IInspectable zpět do skalární nebo maticové hodnoty existuje funkce winrt::unbox_value. Pro rozbalení prvku IInspectable na skalární hodnotu existuje také funkce winrt::unbox_value_or.
Příklady krabicování hodnoty
Funkce LaunchActivatedEventArgs::Arguments accessor vrátí winrt::hstring, což je skalární hodnota. Můžeme zadat hodnotu hstring 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()));
...
}
Chcete-li nastavit vlastnost obsahu tlačítka XAML , zavoláte mutatorovou funkci Button::Content. K nastavení vlastnosti obsahu na řetězcovou hodnotu můžete použít tento kód.
Button().Content(winrt::box_value(L"Clicked"));
Nejprve konstruktor převodu hstring převede řetězcový literál na hstring. Pak se vyvolá přetížení winrt::box_value, které přebírá hstring.
Příklady rozbalení IInspectable
Ve vlastních funkcích, které očekávají IInspectable, můžete k rozbalení použít winrt::unbox_value a k rozbalení s výchozí hodnotou můžete použít winrt::unbox_value_or. Můžete také použít try_as k rozbalení do 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.
}
Určete typ zabalené hodnoty
Pokud obdržíte pole s hodnotou a nejste si jisti, jaký typ obsahuje (potřebujete znát jeho typ, abyste ho mohli rozbalit), můžete zadat dotaz na hodnotu pole pro jeho IPropertyValue rozhraní a potom volat Typ. Tady je příklad kódu.
WINRT_ASSERT je makro definice 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);