WPF是否适用于C ++?

时间:2011-01-23 20:39:13

标签: c++ wpf visual-studio

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

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

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

4 个答案:

答案 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万欧元是免费的。