Подтвердить что ты не робот

Работает ли WPF с С++?

Я понимаю, что Microsoft Visual Studio была переписана для использования WPF. Я все еще не понимаю, почему, но признаю, что мои знания о WPF очень ограничены.

Мой вопрос: если кто-нибудь знает, сколько поддержки WPF для С++, и если Visual Studio все еще написана на С++.

Лично WPF в первую очередь представляет собой .NET/VB/С#. Кто-нибудь использует его с С++?

4b9b3361

Ответ 1

Вы можете использовать WPF с С++/CLI. Однако это .NET API, поэтому для него требуется .NET Framework.

При этом поддержка конструктора не существует с С++. Это означает, что для практических целей WPF на самом деле не работает с С++.

Как правило, уровень пользовательского интерфейса написан на С# (или VB.NET), а затем вызывает код С++, который часто отображается через уровни P/Invoke или С++/CLI. Используя С++/CLI, очень легко взаимодействовать между кодом С++ и кодом С#/VB.NET.

Ответ 2

WPF - это технология .NET. Конечно, он может быть использован с С++, как и любая другая часть .NET, но для этого требуется перескакивать некоторые обходные обручи или, возможно, записывать все это в С++/CLI. (И вам придется писать много кода шаблона самостоятельно, так как дизайнер не работает с С++/CLI.)

И Visual Studio не является и, вероятно, никогда не был "написан на С++". С 2010 года члены команды VS заявили в своих блогах, что VS теперь является главным образом управляемым приложением. Конечно, там еще есть тонна кода С++, и это не уходит в ближайшее время, но многие из них сегодня являются С#/VB.

Но это не произошло за одну ночь. Управляемый код постепенно добавляется в Visual Studio с каждой версией. Visual Studio написана на разных языках.

Если вы действительно спрашиваете: "Могу ли я написать addin для Visual Studio с использованием С++", тогда ответ "да".

Если вы спрашиваете "практично ли писать приложение на С++ и по-прежнему использовать WPF", ответ, вероятно, "только если вы напишете код WPF на С#, а затем добавьте некоторый код взаимодействия, связанный с ним ваше приложение на С++.

Ответ 3

Да, вы можете, и это работает довольно хорошо.

Действительно хороший пример WPPF/XAML с C++ здесь. Microsoft имеет калькулятор Windows с открытым исходным кодом и использует C++ с WPF через файлы XAML.

WPF с визуальным дизайнером также является хорошим вариантом, поскольку он работает намного быстрее и надежнее. (У меня пока нет примера кода, которым я могу поделиться, но я обновлю его, когда сделаю.)

Ответ 4

Графический интерфейс Noesis может запускать пользовательские интерфейсы WPF в 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. Или вы можете просто подключить лямбды, чтобы контролировать события.

Это платная система, хотя она бесплатна и приносит доход менее 100 000 евро в год.