web-dev-qa-db-ja.com

WPFはC ++で動作しますか?

私の理解では、Microsoft Visual StudioはWPFを使用するように書き直されました。理由はまだわかりませんが、WPFに関する私の知識は非常に限られていることを認識しています。

私の質問は、WPFがC++に対してどれだけのサポートを提供しているか、そしてVisual StudioがまだC++で書かれているかどうかを知っている人がいるかどうかです。

個人的には、WPFは主に.NET/VB/C#のように見えます。誰かがC++でそれを使用していますか?

33
Jonathan Wood

C++/CLIでWPFを使用できます。ただし、これは.NET APIであるため、.NET Frameworkが必要です。

そうは言っても、デザイナーのサポートはC++には存在しません。これは、実際には、WPFは実際にはC++では機能しないことを意味します。

通常、ユーザーインターフェイスレイヤーはC#(またはVB.NET)で記述され、C++コードを呼び出します。多くの場合、P/InvokeまたはC++/CLIレイヤーを介して公開されます。 C++/CLIを使用すると、C++コードとC#/ VB.NETコードの相互運用が非常に簡単になります。

47
Reed Copsey

WPFは.NETテクノロジーです。もちろん、canは、.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++アプリとバインドする相互運用コードを持っている場合のみ」 。

16
jalf

はい、できます。かなりうまくいきます。

C++を使用したWPPF/XAMLの非常に良い例は、 here です。 MicrosoftはオープンソースのWindows Calculatorを使用しており、XAMLファイル経由でC++とWPFを使用しています。

ビジュアルデザイナを備えたWPFも、はるかに高速で少し堅牢に動作するため、優れたオプションです。 (まだ共有できるコードサンプルはありませんが、更新したらこれを更新します。)

1
CCondron

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を使いたければ、かなり気の利いたものがあります。または、ラムダを接続してイベントを制御することもできます。

これは有料のフレームワークですが、年間収入が10万ユーロ未満の場合は無料です。

0
scx