Преобразование объекта winrt :: UI :: Xaml :: Controls :: TextBlock в объект C ++ / CX
Если вы хотите порт a C ++ / WinRT объект в C ++ / CX объект. Вы можете создать проект Windows Runtime Component ( C ++ / WinRT ) для решения и поместить в него код преобразования. Затем сделайте так, чтобы проект C ++ / WinRT ссылался на указанный выше компонент (щелкните правой кнопкой мыши имя проекта C ++ / WinRT в обозревателе решений, нажмите «Добавить», выберите «Ссылки», выберите только что добавленное имя компонента. в разделе "Проекты" в диалоговом окне "Добавить ссылку").
Примечание
Вам необходимо использовать Потребление Windows Расширение времени выполнения> Да (/ ZM) в проекте Windows Runtime Component (C ++ / WinRT) вместо проекта C ++ / WinRT.
Затем в Windows Runtime Component ( C ++ / WinRT ) добавьте cx пространство имен и пространство имен winrt, чтобы различать разные объекты на разных языках.
Следующий код можно поместить в класс вашего проекта компонента.
Добавьте необходимые заголовки, например:
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.h>
In the cx namespace, add using statements:
namespace cx
{
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
}
// And, in the winrt namespace, add the needed using statements:
namespace winrt
{
using namespace Windows;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Numerics;
using namespace Windows::UI;
using namespace Windows::UI::Core;
using namespace Windows::UI::Composition;
using namespace winrt::Windows::UI::Xaml::Controls;
using namespace winrt::Windows::UI::Xaml;
}
Add the to_cx method:
template <typename T>
T^ to_cx(winrt::Windows::Foundation::IUnknown const& from)
{
return safe_cast<T^>(reinterpret_cast<Platform::Object^>(winrt::get_abi(from)));
}
//Change the code:
/*auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
Windows::UI::Xaml::FrameworkElement^ cx = to_cx<Windows::UI::Xaml::FrameworkElement^>(text);*/
auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
cx::FrameworkElement^ cx = to_cx<cx::FrameworkElement>(text);
Обратите внимание:
Пожалуйста, не помещайте код преобразования на страницу XAML, потому что ваши типы страниц XAML должны быть полностью C ++ / CX или полностью C ++ / WinRT. Вы можете смешивать C ++ / CX и C ++ / WinRT вне типов страниц XAML в одном проекте.
Функция, которая использует код преобразования в классе проекта компонента, должна быть объявлена в классе idl сначала файл, иначе мы не сможем ссылаться на функцию в другом проекте.
Обновление:
Вот простой образец , который я создал, когда нажал кнопку в основном проекте, я вызвал метод Windows Runtime Component, чтобы запустить метод to_cx, вы можете это проверить.