【问题标题】:Does WPF Work with C++?WPF 可以与 C++ 一起使用吗?
【发布时间】:2011-06-14 03:56:58
【问题描述】:

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

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

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

【问题讨论】:

  • 您是在询问 WPF + C++ 一般情况,还是专门询问它在 Visual Studio 中的使用?
  • 实际上有两个问题。其中之一与将 WPF 与 C++ 结合使用有关。另一个与用于编写 Visual Studio 的语言有关。
  • Visual Studio 在 2010 版本中确实使用 WPF 作为其 UI 的一部分。 Visual Studio 的大部分仍然是用 C++ 编写的。

标签: c++ wpf visual-studio


【解决方案1】:

您可以将 WPF 与 C++/CLI 一起使用。但是,它是一个 .NET API,因此需要 .NET Framework。

话虽如此,C++ 不存在设计器支持。这意味着,出于实际目的,WPF 并不真正适用于 C++。

通常,用户界面层是用 C#(或 VB.NET)编写的,然后调用 C++ 代码,通常通过 P/Invoke 或 C++/CLI 层公开。通过使用 C++/CLI,C++ 代码和 C#/VB.NET 代码之间的互操作非常容易。

【讨论】:

  • 谢谢。这几乎就是我的想法。但这让我想知道为什么要为 WPF 重写 VS。我问是因为这些天我做了很多 C#,并且想知道我是否应该选择 WPF 而不是我过去使用过的 MFC。
  • @Jonathan:如果您使用的是 C#,我会认真研究 WPF。它在许多方面都优越得多......我写了一个关于从 Windows 窗体迁移到 WPF 的系列文章——虽然它不是 MFC,但同样的概念也适用。它会让您对 WPF 的一些好处有一个很好的了解:reedcopsey.com/talks/from-windows-forms-to-wpf-with-mvvm
  • 我过去的经验是用于桌面的 C++/MFC 和用于 Web 的 C#/WebForms。所以我没有花太多时间在 WinForms 上。但由于我最近的大部分开发都是针对 Web 的,所以我越来越习惯于使用 C#。我会看看你的链接。
  • @Jonathan:从 MFC 的角度来看,这很有意义,而且大部分也适用于 Silverlight。如果您想考虑为桌面或 Web 切换到 WPF 或 Silverlight,应该很有用...
  • 现在有什么变化吗?我很想在本机可执行文件中使用 C++ 中的这个 GUI。
【解决方案2】:

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++ 应用程序。

【讨论】:

  • 有趣的是,开发人员说 VS 2010 现在主要是托管代码。我希望我能更好地了解管理的数量和原因。我之所以这么问,是因为我过去做过很多 MFC,我想知道迁移到我最近经常使用的 C# 和 WPF 是否有意义。
  • @Jonathan:对于 UI 工作,我肯定更喜欢 WPF(可能使用 C#/VB)而不是微软生产的任何其他产品。在大多数情况下,C# 是一种非常好的语言,因此可能将它用于 UI 之外的其他用途。
  • 我想知道为什么 Visual Studio 在 2008 版本之后开始加载和工作如此缓慢。现在我知道答案了……
  • 顺便说一句,托管并不意味着他们使用 C#。可能是他们将 C++ 与 CLR/CLI 一起使用。
  • @Lilian A. Moraru:我感觉不到。此外,它的加载速度仍然比任何 Java 程序都快。
【解决方案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 上玩得开心,他们有一些非常漂亮的东西。或者你可以连接 lambdas 来控制事件。

这是一个付费框架,尽管它是免费的,年收入不到 10 万欧元。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2019-01-25
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多