WPF能与C++一起使用吗?

43

我的理解是微软Visual Studio被重写为使用WPF。我仍然不清楚原因,但承认我对WPF的了解非常有限。

我的问题是是否有人知道WPF对C ++的支持程度如何,以及Visual Studio是否仍然是用C ++编写的。

就我个人而言,WPF似乎主要是.NET / VB / C#的东西。有没有人在使用C ++?


你是在询问关于WPF + C++的一般问题,还是关于它在Visual Studio中的使用? - jalf
1
实际上有两个问题。一个与使用WPF和C++有关,另一个与编写Visual Studio的语言有关。 - Jonathan Wood
Visual Studio在2010版本中确实使用WPF作为其用户界面的一部分。Visual Studio的大部分仍然是用C++编写的。 - JaredPar
请查看此链接:http://msdn.microsoft.com/zh-cn/library/ms742522.aspx - Lilian A. Moraru
3个回答

61

您可以使用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代码之间进行互操作。


谢谢。这基本上就是我想的。但这让我想知道为什么VS会被重写为WPF。我问这个问题是因为我现在做了很多C#,并且想知道是否应该选择WPF而不是我过去使用过的MFC。 - Jonathan Wood
1
@Jonathan:如果你正在使用C#,我真的会认真考虑WPF。它在许多方面都要优于其他解决方案... 我写了一系列关于从Windows Forms迁移到WPF的文章 - 虽然它不是MFC,但相同的概念适用于两者。这将为您提供有关WPF的一些优势的好主意:http://reedcopsey.com/talks/from-windows-forms-to-wpf-with-mvvm/ - Reed Copsey
1
我的过去经验主要是桌面端的C++/MFC和Web端的C#/WebForms。因此,我没有花太多时间学习WinForms。但由于我最近的大部分开发都是针对Web的,我对C#变得越来越熟悉了。我会查看你提供的链接。 - Jonathan Wood
@Jonathan:从MFC的角度来看,这将是有意义的,而且大部分内容也适用于Silverlight。如果您想考虑转换到桌面或Web的WPF或Silverlight,这应该是有用的... - Reed Copsey
现在有任何变化吗?我很想在本地可执行文件中使用这个C++ GUI。 - Jack

19

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++应用程序绑定在一起时才可行。”


有趣的是,开发人员表示VS 2010现在主要是托管代码。我希望我能更好地了解有多少是托管的以及原因。我主要是想问,因为我过去做了很多MFC,想知道是否有意义转移到最近我经常使用的C#和WPF。 - Jonathan Wood
1
@Jonathan:对于用户界面的工作,我肯定会选择WPF(可能使用C#/VB),而不是Microsoft生产的其他任何东西。对于大多数情况来说,C#是一种非常好的语言,因此将其用于UI以外的更多方面可能是有意义的。 - jalf
7
我想知道为什么Visual Studio在2008版本后开始加载和工作得如此缓慢。现在我知道答案了... - Lilian A. Moraru
顺便说一下,"managed"并不意味着他们使用C#。他们可能使用带有CLR/CLI的C++。 - Lilian A. Moraru
7
@Lilian A. Moraru: 我感觉不到它。同时,加载速度仍然比任何Java程序都要快。 - Hexo

3
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表达式与事件控制器连接起来。

这是一个收费框架,但对于年收入不到 €100K 的用户免费。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接