私の理解では、Microsoft Visual StudioはWPFを使用するように書き直されました。理由はまだわかりませんが、WPFに関する私の知識は非常に限られていることを認識しています。
私の質問は、WPFがC++に対してどれだけのサポートを提供しているか、そしてVisual StudioがまだC++で書かれているかどうかを知っている人がいるかどうかです。
個人的には、WPFは主に.NET/VB/C#のように見えます。誰かがC++でそれを使用していますか?
C++/CLIでWPFを使用できます。ただし、これは.NET APIであるため、.NET Frameworkが必要です。
そうは言っても、デザイナーのサポートはC++には存在しません。これは、実際には、WPFは実際にはC++では機能しないことを意味します。
通常、ユーザーインターフェイスレイヤーはC#(またはVB.NET)で記述され、C++コードを呼び出します。多くの場合、P/InvokeまたはC++/CLIレイヤーを介して公開されます。 C++/CLIを使用すると、C++コードとC#/ VB.NETコードの相互運用が非常に簡単になります。
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++アプリとバインドする相互運用コードを持っている場合のみ」 。
はい、できます。かなりうまくいきます。
C++を使用したWPPF/XAMLの非常に良い例は、 here です。 MicrosoftはオープンソースのWindows Calculatorを使用しており、XAMLファイル経由でC++とWPFを使用しています。
ビジュアルデザイナを備えたWPFも、はるかに高速で少し堅牢に動作するため、優れたオプションです。 (まだ共有できるコードサンプルはありませんが、更新したらこれを更新します。)
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万ユーロ未満の場合は無料です。