Ma compréhension est que Microsoft Visual Studio a été réécrit pour utiliser WPF. Je ne sais toujours pas pourquoi, mais je reconnais que mes connaissances sur WPF sont très limitées.
Ma question est de savoir si quelqu'un sait quelle prise en charge WPF a pour C++ et si Visual Studio est toujours écrit en C++.
Personnellement, WPF semble principalement être une chose .NET/VB/C #. Quelqu'un l'utilise-t-il avec C++?
Vous pouvez utiliser WPF avec C++/CLI. Il s'agit cependant d'une API .NET, elle nécessite donc le .NET Framework.
Cela étant dit, le support du concepteur est inexistant avec C++. Cela signifie que, pour des raisons pratiques, WPF ne fonctionne pas vraiment avec C++.
En règle générale, la couche d'interface utilisateur est écrite en C # (ou VB.NET), puis appelle en code C++, souvent exposée via des couches P/Invoke ou C++/CLI. En utilisant C++/CLI, il est très facile d'interopérer entre le code C++ et le code C #/VB.NET.
WPF est une technologie .NET. Bien sûr, il peut être utilisé avec C++, comme toute autre partie de .NET peut, mais il vous oblige à sauter à travers certains cercles d'interopérabilité, ou éventuellement tout écrire en C++/CLI. (Et vous devrez écrire vous-même beaucoup de code standard, car le concepteur ne fonctionne pas avec C++/CLI.)
Et Visual Studio n'est pas, et n'a probablement jamais été, "écrit en C++". Avec 2010, les membres de l'équipe VS ont déclaré sur leurs blogs que VS est désormais principalement une application managée. Bien sûr, il y a encore une tonne de code C++, et cela ne disparaîtra pas de si tôt, mais une grande partie est en C #/VB aujourd'hui.
Mais cela ne s'est pas produit du jour au lendemain. Le code managé a été progressivement ajouté à Visual Studio avec chaque version. Visual Studio est écrit dans de nombreuses langues différentes.
Si ce que vous demandez réellement est "puis-je écrire un complément pour Visual Studio en utilisant C++", alors la réponse est "oui".
Si vous demandez "est-il pratique d'écrire une application en C++ et d'utiliser toujours WPF", la réponse est probablement "uniquement si vous écrivez le code WPF en C #, puis que vous avez du code d'interopérabilité le liant avec votre application C++ .
Oui, vous pouvez, et cela fonctionne plutôt bien.
Un très bon exemple de WPPF/XAML avec C++ est ici . Microsoft a ouvert la calculatrice Windows et utilise C++ avec WPF via des fichiers XAML.
WPF avec un concepteur visuel est également une bonne option car il fonctionne beaucoup plus rapidement et un peu plus robuste. (Je n'ai pas encore d'exemple de code à partager pour cela, mais je le mettrai à jour lorsque je le ferai.)
Noesis gui peut exécuter des interfaces utilisateur WPF en c ++. Vous devrez adapter les classes c # au c ++ (en utilisant leurs macros de réflexion, etc.). Certains contrôles ne sont pas pris en charge, mais il est assez élégant.
Par exemple, WPF peut générer:
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)
{
}
}
}
Ensuite, vous le convertissez en 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");
}
};
Plus d'informations ici: https://www.noesisengine.com/docs/Gui.Core.BlendTutorial.html
Ils ont des trucs assez chouettes si vous voulez aller avec des modèles de données, des liaisons et des mvvp. Ou vous pouvez simplement connecter des lambdas pour contrôler les événements.
C'est un cadre payant, bien qu'il soit gratuit pour moins de 100 000 € de revenu annuel.