我的理解是微软Visual Studio被重写为使用WPF。我仍然不清楚原因,但承认我对WPF的了解非常有限。
我的问题是是否有人知道WPF对C ++的支持程度如何,以及Visual Studio是否仍然是用C ++编写的。
就我个人而言,WPF似乎主要是.NET / VB / C#的东西。有没有人在使用C ++?
我的理解是微软Visual Studio被重写为使用WPF。我仍然不清楚原因,但承认我对WPF的了解非常有限。
我的问题是是否有人知道WPF对C ++的支持程度如何,以及Visual Studio是否仍然是用C ++编写的。
就我个人而言,WPF似乎主要是.NET / VB / C#的东西。有没有人在使用C ++?
您可以使用C++/CLI与WPF一起使用。但是,WPF是一个.NET API,因此需要.NET Framework。
即便如此,使用C++时设计支持非常缺乏。实际上,这意味着WPF在实际应用中并不适用于C++。
通常情况下,用户界面层使用C#(或VB.NET)编写,然后调用C ++ 代码,经常通过P / Invoke或C++ / CLI层进行公开。 使用C++/CLI,很容易在C++代码和C#/ VB.NET代码之间进行互操作。
WPF是一种.NET技术。当然,像.NET的任何其他部分一样,它可以与C++一起使用,但这需要你跨越一些交互操作的障碍,或者可能要全部用C++/CLI编写。(由于设计师不支持C++/CLI,所以你将不得不自己编写大量样板代码。)
而且Visual Studio并没有,也许永远不会,“用C++编写”。在2010年,VS团队的成员在他们的博客上表示,VS现在主要是一个托管应用程序。当然,还有很多C++代码,而且这不会很快消失,但今天有很多是用C#/VB编写的。
但这并不是一夜之间发生的。随着每个版本的发布,管理代码逐渐添加到Visual Studio中。Visual Studio用许多不同的语言编写。
如果你实际上问的是“我能用C++为Visual Studio编写插件吗”,那么答案是“可以”。
如果你正在问“用C++编写应用程序,同时仍然使用WPF是否可行”,那么答案可能是“只有在用C#编写WPF代码,然后有一些交互操作代码将其与你的C++应用程序绑定在一起时才可行。”
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等高级功能,它们提供了一些非常方便的工具。或者,您可以将lambda表达式与事件控制器连接起来。
这是一个收费框架,但对于年收入不到 €100K 的用户免费。