C++/WinRT ile değerleri IInspectable'a kutulama ve kutudan çıkarma

Uyarı

Winrt::box_value ve winrt::unbox_value işlevlerini kullanarak yalnızca skaler değerleri değil, aynı zamanda çoğu dizi türünü de (numaralandırma dizileri dışında) kutulayabilir ve kaldırabilirsiniz. winrt::unbox_value_or işlevini kullanarak yalnızca skaler değerleri çözebilirsiniz.

IInspectable arabirimi, Windows Çalışma Zamanı (WinRT) ortamında her bir çalışma zamanı sınıfının kök arabirimidir. Bu, her COM arabirimi ve sınıfının kökünde IUnknown'un yer almasına benzer bir fikirdir; ve System.Object her Ortak Tür Sistemi sınıfının kökünde yer alır.

Başka bir deyişle, IInspectable bekleyen bir işlev herhangi bir çalışma zamanı sınıfının örneğine geçirilebilir. Ancak, böyle bir işleve doğrudan skaler değer (sayısal veya metin değeri gibi) veya dizi geçiremezsiniz. Bunun yerine, bir skaler veya dizi değerinin bir başvuru sınıfı nesnesi içinde sarmalanması gerekir. Bu sarmalama işlemi, değer'e kutulanması olarak bilinir.

Önemli

Windows Çalışma Zamanı API'sine geçirebileceğiniz herhangi bir türü kutulayabilir ve kutudan çıkarabilirsiniz. Başka bir deyişle, bir Windows Çalışma Zamanı türü. Sayısal değerler ve metin değerleri (dizeler) ve diziler, yukarıda verilen örneklerden bazılarıdır. Bir diğer örnek de IDL'de tanımladığınız bir struct örnektir. Standart bir C++ struct (IDL'de tanımlanmayan) kutulamaya çalışırsanız, derleyici size yalnızca bir Windows Çalışma Zamanı türünü kutulayabileceğinizi hatırlatır. Çalışma zamanı sınıfı bir Windows Çalışma Zamanı türüdür, ancak çalışma zamanı sınıflarını kutulamadan Windows Çalışma Zamanı API'lerine geçirebilirsiniz.

C++/WinRT, skaler veya dizi değeri alan ve IInspectableiçinde kutulanan değeri döndüren winrt::box_value işlevini sağlar. Bir IInspectable skaler veya dizi değerine geri döndürmek için winrt::unbox_value işlevi vardır. Bir IInspectable nesneyi skaler bir değere geri döndürüldüğünde, winrt::unbox_value_or işlevi de kullanılabilir.

Değerin kutulanması örnekleri

LaunchActivatedEventArgs::Arguments erişimci işlevi, skaler bir değer olan winrt::hstring değerini döndürür. Hstring değerini kutulayabilir ve bunu bunun gibi IInspectable bekleyen bir işleve geçirebiliriz.

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

bir XAML Düğmesi'nin içerik özelliğini ayarlamak için Button::Content mutator işlevini çağırırsınız. İçerik özelliğini bir dize değerine ayarlamak için bu kodu kullanabilirsiniz.

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

hstring dönüştürücü, string sabitini hstringolarak dönüştürür. Ardından, bir hstring alan winrt::box_value aşırı yüklemesi çağrılır.

IInspectable'ın kutu açma örnekleri

IInspectablebekleyen kendi işlevlerinizde, winrt::unbox_value kullanarak kutudan çıkarabilir ve varsayılan değerle kutudan çıkarmak için winrt::unbox_value_or kullanabilirsiniz. try_as kullanarak, std::optionalkutusunu açabilirsiniz.

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

Kutulanmış değerin türünü belirleme

Eğer kutulanmış bir değer alırsanız ve içeriğinde ne tür bir veri olduğunu bilmiyorsanız (kutuyu açmak için türünü bilmeniz gerekir), o zaman kutulanmış değeri IPropertyValue arabirimi için sorgulayabilir ve ardından Tür çağrısını yapabilirsiniz. İşte bir kod örneği.

WINRT_ASSERT bir makro tanımıdır ve _ASSERTEolarak genişletilir.

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);

Önemli API'ler