web-dev-qa-db-ja.com

XAMLなしのWPF

アーキテクチャ的には、WPFはかなり素晴らしいと思います。一般的に、私は基礎となるレンダリング/アニメーションの内部動作の大ファンです。テンプレートとスタイリングのセットアップの柔軟性はかなり印象的です。

しかし、私はXAMLを嫌います-それは多くのことを複雑にしているように感じます。私はこれを大小のアプリケーションで使用してきましたが、基本的な原則は基本ですが構文がおかしいXAMLで何かを行う方法を何度も見つけようとしています。それだけでなく、解析/バインディングの特定の部分がどれほど重いのか、何度も疑問に思いました。 (コンパイルされていることは知っていますが、実行時にまだどれだけ評価されているかはわかりません)

XAMLは、ビジュアルツリーを構築およびロードする1つの方法にすぎません。非XMLのコードベース(ただし大部分は宣言型)の方法でビジュアルツリーを簡単に構築するためのフレームワークはありますか?具体的には、MVVMアプローチを維持しながら、次の問題のいずれかを軽減するフレームワークに興味があります。

  1. 強く型付けされたバインディング。 ViewModelが特定のタイプに準拠する必要があることを指定します。 BaseBindingは内部でリフレクションを使用していると思いますが、壊れたバインディングが煩わしいことは言うまでもなく、その速度については少し懐疑的です。

  2. より高速なバインディング、非INotifyPropertyChangedバインディング。ある種のBindableProperty<T>を作成でき、バインディングはすべてのViewModelプロパティの変更を受け取るのではなく、それを直接リッスンできるようです。また、文字列引数に対して直接コールバックを使用することも有利であるように思われます。

  3. リソース管理への異なるアプローチ。繰り返しますが、ある種の強く型付けされた辞書はかなりいいかもしれません。スタイルをラムダまたは強く型付けされた側面をキャプチャするものとして見たいと思います。

要約すると、非XAMLベースで、MVVMにうまく適合し、強く型付けされているフレームワークはありますか?

47
J Trana

XamlフリーのWPFでサポートします。私はWPFのレイアウトとバインド機能が好きですが、XAMLも嫌いです。 WPFをプレーンなC#で記述できるといいのですが、いくつかの利点があります。

  • オブジェクトおよびコレクションの初期化子 Xamlのインスタンス化を置き換えることができます。 (xamlがボタンアップよりもトップダウンを好むのは残念です)。
  • Binding Convertersは単なるラムダである可能性があります。
  • Stylesは、インスタンス化後にオブジェクトを変更する単なるラムダであり、肥大化することはありません<Setter>構文。
  • DataTemplatesは、オブジェクトを指定してコントロールを作成するラムダになります
  • DataTemplateSelectorsは、他のDataTemplateを呼び出す単なるDataTemplateラムダになります。
  • ItemsControlラムダ(DataTemplate)を受け取り、基になるコレクションに新しいアイテムが追加された場合に再度呼び出すForeachになります。
  • x:Namesは単なる変数名になります。
  • 多くのMarkupExtensionsは必要ありません
    • x:静的
    • x:Type(特に複雑なジェネリックも!)
  • serControlsは単なる関数になります。

WPFを設計するには、複雑さが増しすぎたと思います。 Web開発は、FrontPageの昔からRazorへのこの戦いにすでに負けています。

27
Olmo

この質問には間違いなく Bling UI Toolkit へのリンクが必要です。これは、WPF上でのアニメーションと豊富なUIプロトタイピングのための超天才的な高レベルライブラリです。 _button.Width = 100 - slider.Value_とのバインド、次のようなアニメーション:button.Left.Animate().Duration(500).To = label.Right、ピクセルシェーダーコンパイラ-すばらしい。

悲しいことに、私はプロジェクトがもう取り組んでいないと思います。しかし、思考の糧を与えるための非常に賢いアイデアがたくさんあります。

5
Govert

WPFにはこのようなフレームワークはありません。ウィッシュリストで言及する3つのことは、WPFによって既に提供されているコンポーネントの直接(および異なる)置換です。また、バインディングシステムとリソースシステムをバージョンに置き換えると、バインディングやリソースなどに大きく依存するため、WPFの好きなもの(アニメーション、テンプレートなど)が使用できなくなります。

ここにあなたの経験を改善するかもしれないいくつかの提案があります。
1。 XAMLの扱い方を学ぶ(以前はその根性も嫌いでしたが、今ではそれに慣れているので素晴らしいです)
2。コードでUIを簡単に作成できる独自のライブラリを構築します。結局のところ、XAMLで行われることはすべて、コードでも同様に行うことができます。
3。 INotifyPropertyChangedが本当に嫌いで、代わりにコールバックが必要な場合は、代わりにDependencyPropertyを使用してください。発生させるイベントはありません。コールバックとデフォルト値を設定できます。
4。)WPFを使用しないでください。あなたがアーキテクチャを愛していると言っても、欠点/望ましい「改善」のリストはそれのほとんどすべてをカバーしています。

2
A.R.

単純化?いいえ。ただし、XAMLで実行できることはすべて、コードで実行できます。たとえば、これは単純なWindowsインク描画アプリです-可能な限り単純です:

who needs visual studio? green ink on purple background

保存も変更もありませんが、コードを使用することはできます。

Sketchpad.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Ink;

public class Sketchpad : Application {

    [STAThread]
    public static void Main(){
        var app = new Sketchpad();
        Window root = new Window();
        InkCanvas inkCanvas1 = new InkCanvas();

        root.Title = "Skortchpard";

        root.ResizeMode = ResizeMode.CanResizeWithGrip;
        inkCanvas1.Background = Brushes.DarkSlateBlue;
        inkCanvas1.DefaultDrawingAttributes.Color = Colors.SpringGreen;
        inkCanvas1.DefaultDrawingAttributes.Height = 10;
        inkCanvas1.DefaultDrawingAttributes.Width = 10;

        root.Content = inkCanvas1;
        root.Show();
        app.MainWindow = root;
        app.Run();
    }

}

Sketchpad.csproj

<Project DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
  <PropertyGroup>
    <AssemblyName>Simply Sketch</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xaml">
      <RequiredTargetFramework>4.0</RequiredTargetFramework>
    </Reference>
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="SketchPad.cs" />
  </ItemGroup>
  <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
    <Target Name="Clean">
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

必要なのはそれだけです。確かに、XAMLを回避したい場合、それは基本的に、代替の.NETコードを大量に作成する必要があることを意味するので、それはあなた次第です-そのようなものをXAMLにダンプしますか、それともむしろコードでそれを書きますか?

VS内でそれを行う最大の利点は、優れた設計者のサポートが得られることです。そのため、通常、すべてがどこにあり、どこに行くのかを視覚的に確認するのは非常に簡単です。また、おそらくドキュメントを検索することが少なくなり、時にはいくつかの飛躍をしなければならないこともあります。

ただし、XAMLなしのWPFは可能です

このためにVisualStudioをインストールする必要はなく、.NETCLIと開発者コマンドプロンプトだけをインストールする必要があります。これら2つのファイルをフォルダーにドロップし、msbuildを実行すると、Binディレクトリでファイルを実行できます。

1
Wayne Werner
> non-INotifyPropertyChanged binding.

手動でINotifyPropertyChangedをviewmodellまたはmodellに実装することは、非常に多くの手動/反復作業です。しかし、私はこれらについて読みました代替

  • DynamicViewModel:.NET 4.0でPOCOを使用するMVVM:このプロジェクトは、Plain Old CLR Objects(POCO)を使用してModel View ViewModel(MVVM)アーキテクチャパターンを実装する方法を提供することを目的としています。 .NET 4.0DynamicObjectクラスを最大限に活用しながら。 .NET 4.0とDynamicObjectクラスを利用して、DynamicObjectクラスから派生した型を作成し、実行時の動的な動作を指定できます。さらに、派生型にINotifyPropertyChangedインターフェイスを実装して、データバインディングの適切な候補にすることができます。

  • pdate Controls .NET:INotifyPropertyChangedを使用しないWPFおよびSilverlightデータバインディング。依存関係を自動的に検出するため、ビューモデルで依存関係を管理する必要はありません。そしてそれはWinformsで動作します。イベントを使用してコードをバインドします。

  • notifypropertyweaver:ILウィービングを使用して( http://www.mono-project.com/Cecil 経由)INotifyPropertyChangedコードをプロパティに挿入します。

    • 属性は必要ありません
    • 参照は必要ありません
    • 基本クラスは必要ありません
    • .net 3.5、.net 4、Silverlight 3、Silverlight 4、およびWindows Phone7をサポートします
    • クライアントプロファイルモードをサポート
0
k3b