Работает ли WPF с С++?
Я понимаю, что Microsoft Visual Studio была переписана для использования WPF. Я все еще не понимаю, почему, но признаю, что мои знания о WPF очень ограничены.
Мой вопрос: если кто-нибудь знает, сколько поддержки WPF для С++, и если Visual Studio все еще написана на С++.
Лично WPF в первую очередь представляет собой .NET/VB/С#. Кто-нибудь использует его с С++?
Ответы
Ответ 1
Вы можете использовать WPF с С++/CLI. Однако это .NET API, поэтому для него требуется .NET Framework.
При этом поддержка конструктора не существует с С++. Это означает, что для практических целей WPF на самом деле не работает с С++.
Как правило, уровень пользовательского интерфейса написан на С# (или VB.NET), а затем вызывает код С++, который часто отображается через уровни P/Invoke или С++/CLI. Используя С++/CLI, очень легко взаимодействовать между кодом С++ и кодом С#/VB.NET.
Ответ 2
WPF - это технология .NET. Конечно, он может быть использован с С++, как и любая другая часть .NET, но для этого требуется перескакивать некоторые обходные обручи или, возможно, записывать все это в С++/CLI. (И вам придется писать много кода шаблона самостоятельно, так как дизайнер не работает с С++/CLI.)
И Visual Studio не является и, вероятно, никогда не был "написан на С++". С 2010 года члены команды VS заявили в своих блогах, что VS теперь является главным образом управляемым приложением. Конечно, там еще есть тонна кода С++, и это не уходит в ближайшее время, но многие из них сегодня являются С#/VB.
Но это не произошло за одну ночь. Управляемый код постепенно добавляется в Visual Studio с каждой версией. Visual Studio написана на разных языках.
Если вы действительно спрашиваете: "Могу ли я написать addin для Visual Studio с использованием С++", тогда ответ "да".
Если вы спрашиваете "практично ли писать приложение на С++ и по-прежнему использовать WPF", ответ, вероятно, "только если вы напишете код WPF на С#, а затем добавьте некоторый код взаимодействия, связанный с ним ваше приложение на С++.
Ответ 3
Да, вы можете, и это работает довольно хорошо.
Действительно хороший пример WPPF/XAML с C++ здесь. Microsoft имеет калькулятор Windows с открытым исходным кодом и использует C++ с WPF через файлы XAML.
WPF с визуальным дизайнером также является хорошим вариантом, поскольку он работает намного быстрее и надежнее. (У меня пока нет примера кода, которым я могу поделиться, но я обновлю его, когда сделаю.)
Ответ 4
Графический интерфейс Noesis может запускать пользовательские интерфейсы WPF в c++. Вам придется адаптировать классы С# к c++ (используя их макросы отражения и т.д.). Некоторые элементы управления не поддерживаются, но это довольно элегантно.
Например, WPF может генерировать:
MainWindow.xaml.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Input;
namespace BlendTutorial
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
}
private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
}
private void ContainerBorder_MouseDown(object sender, MouseButtonEventArgs e)
{
}
private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
}
}
}
Затем вы должны преобразовать его в c++:
namespace BlendTutorial
{
class MainWindow final: public Window
{
public:
MainWindow()
{
InitializeComponent();
}
private:
void InitializeComponent()
{
Noesis::GUI::LoadComponent(this, "MainWindow.xaml");
}
bool ConnectEvent(BaseComponent* source, const char* event, const char* handler) override
{
NS_CONNECT_EVENT(Button, Click, AddButton_Click);
NS_CONNECT_EVENT(Button, Click, RemoveButton_Click);
NS_CONNECT_EVENT(Border, PreviewMouseLeftButtonDown, ContainerBorder_MouseDown);
NS_CONNECT_ATTACHED_EVENT(ToggleButton, Checked, RadioButton_Checked);
return false;
}
void AddButton_Click(BaseComponent*, const RoutedEventArgs&)
{
}
void RemoveButton_Click(BaseComponent*, const RoutedEventArgs&)
{
}
void ContainerBorder_MouseDown(BaseComponent*, const MouseButtonEventArgs&)
{
}
void RadioButton_Checked(BaseComponent*, const RoutedEventArgs&)
{
}
NS_IMPLEMENT_INLINE_REFLECTION(MainWindow, Window)
{
NsMeta<TypeId>("BlendTutorial.MainWindow");
}
};
Более подробная информация здесь: https://www.noesisengine.com/docs/Gui.Core.BlendTutorial.html
У них есть некоторые изящные вещи, если вы хотите попрощаться с моделями данных, привязками и mvvp. Или вы можете просто подключить лямбды, чтобы контролировать события.
Это платная система, хотя она бесплатна и приносит доход менее 100 000 евро в год.