Передача элементов пользовательского интерфейса в и из компонентов среды выполнения Windows в разных средах?
Интересно, есть ли способ создать компонент времени выполнения (написанный на C#, например), который позволяет работать с элементами пользовательского интерфейса из разных сред.
Например, я хотел бы добавить элемент пользовательского интерфейса, такой как MediaElement
к данному Panel
(C#) или div
(Javascript).
Могу ли я вызвать метод во время выполнения компонента, как это: cmpt.setPlayer((Panel) playerParent);
(C#) и cmpt.setPlayer(getElementByClass('.playerParent'));
(Javascript). Это возможно как-то?
Если нет (и я бы полностью это понял), есть ли способ создать один компонент времени выполнения, который предлагает, скажем, два способа объявления функции, один для вызова из C# и один для Javascript?
1 ответ
На самом деле невозможно совместно использовать элементы пользовательского интерфейса между механизмом рендеринга HTML/CSS (приложение JS) и компонентом C#/C++. В коде C# не будет базовой среды выполнения, которая понимает объект HTML-элемента. Точно так же UIElement из XAML не будет иметь никакого смысла для движка HTML/CSS в приложении JS. Короче говоря, элементы пользовательского интерфейса не могут быть разделены через эту границу, и, таким образом, компоненты среды выполнения Windows предназначены для функциональных возможностей не-пользовательского интерфейса.
На ваш второй вопрос, компоненты не структурированы так, чтобы делать то, что вы предлагаете, то есть иметь отдельные методы C# и JS, потому что вы не можете реализовать компонент в JavaScript для начала. Идея состоит в том, что метод, написанный на C# или C++, проецируется в JavaScript во время выполнения, но он все еще реализован на этих языках.
Люди, которые разрабатывают библиотеки, связанные с пользовательским интерфейсом для приложений Магазина Windows, обычно реализуют отдельные версии для C#/C++ и для JS из-за этих различий. Конечно, вещи, не относящиеся к пользовательскому интерфейсу, могут входить в его собственный компонент WinRT, и я думаю, что у вас может быть библиотека JS, добавляющая вещи в пространство имен, поступающее из компонента, потому что последний проецируется в JS как объект JS, как и любой другой. Такой гибридный подход будет держать вашу поверхность API в одном пространстве имен, даже если он имеет смешанную реализацию. Я не пробовал это все же.
Альтернативный подход может заключаться в том, чтобы компонент WinRT использовал различные обратные вызовы для инструктирования хост-приложения выполнять задачи пользовательского интерфейса, что обязательно должно включать создание элементов пользовательского интерфейса. Компонент может управлять параметрами и базовой моделью данных, то есть использовать эти обратные вызовы, чтобы соответствующим образом инициировать работу пользовательского интерфейса.
Стоит отметить, что в главе 18 моей бесплатной электронной книги " Программирование приложений для Магазина Windows с использованием HTML, CSS и JavaScript, 2-е издание" я провел довольно исчерпывающую обработку компонентов WinRT, в том числе асинхронных.