我的理解是Microsoft Visual Studio被重写为使用WPF。我仍然不清楚为什么,但承认我对WPF的了解非常有限。
我的问题是,是否有人知道WPF对C ++有多少支持,以及Visual Studio是否仍然用C ++编写。
就个人而言,WPF主要似乎是.NET / VB / C#的东西。是否有人在C ++中使用它?
答案 0 :(得分:47)
您可以将WPF与C ++ / CLI一起使用。但它是一个.NET API,所以它需要.NET Framework。
话虽这么说,设计师的支持在C ++中是不存在的。这意味着,出于实际目的,WPF并不真正适用于C ++。
通常,用户界面层是用C#(或VB.NET)编写的,然后调用C ++代码,通常通过P / Invoke或C ++ / CLI层公开。通过使用C ++ / CLI,可以非常轻松地在C ++代码和C#/ VB.NET代码之间进行互操作。
答案 1 :(得分:16)
WPF是一种.NET技术。当然它可以与C ++一起使用,就像.NET的任何其他部分一样,但它需要你跳过一些互操作,或者可能用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 ++应用程序。
答案 2 :(得分:1)
是的,而且效果很好。
here是使用C ++的WPPF / XAML的一个很好的例子。 微软已经开源了Windows计算器,它通过XAML文件将C ++与WPF结合使用。
具有视觉设计师的WPF也是一个不错的选择,因为它运行速度更快,功能更强大。 (我还没有可以共享的代码示例,但是我会在以后更新它。)
答案 3 :(得分:0)
Noesis gui可以在c ++中运行WPF UI。您将必须使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混为一谈,它们有一些漂亮的东西。或者,您也可以仅连接lambda来控制事件。
这是一个付费框架,尽管它的年收入不足10万欧元是免费的。