WPF without XAML WPF without XAML wpf wpf

WPF without XAML


I support you in Xaml-free WPF. I love layout and binding capabilities of WPF but I hate XAML too. I would love that WPF could be written in plain C#, some advantages:

  • Object and Collection initializers could replace Xaml instantiations. (it's a pity that xaml prefers top-down than button up).
  • Binding converters could be just lambdas.
  • Styles could be just lambdas that modify an object after instantiation, no bloated <Setter> syntax.
  • DataTemplates would be just lambdas that create controls given an object
  • DataTemplateSelectors would be just a DataTemplate lambda that calls other DataTemplates.
  • ItemsControl Would be just a Foreach that takes a lambda (DataTemplate) and calls it again if a new item is added to the underlying collection.
  • x:Names would be just variable names.
  • No need for many MarkupExtensions
    • x:Static
    • x:Type (specially with complex generics too!)
  • UserControls would be just functions.

I think way too much complexity was added to WPF to allow it to be designed. Web development has already lost this battle from the old days of FrontPage to Razor.


Simplifying? No. But everything you can do in XAML you can just do in code. For example, here's a simple Windows Ink drawing app - pretty much as simple as you could possibly make it:

who needs visual studio? green ink on purple background

No saving, no changing anything - but you can through code.

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>

That's all it takes. Granted, if you want to avoid XAML, that basically means you're going to have to write a bunch of alternate .NET code, so it's kind of up to you - do you want to dump of that stuff in XAML, or would you rather write it in code?

I think the biggest benefit to doing it within VS is you get good designer support so it's typically pretty easy to visually see where everything is and goes. It's also probably less looking up the documentation and sometimes having to make a few leaps.

But WPF without XAML is possible.

You don't even need Visual Studio installed for this, just the .NET CLI and the Developer Command Prompt. Drop these two files in a folder and run msbuild and then you can run the file in the Bin directory.


This question definitely needs a link to the Bling UI Toolkit. It's a super-genius high-level library for animation and rich UI prototyping on top of WPF. Binding with button.Width = 100 - slider.Value, animation like this: button.Left.Animate().Duration(500).To = label.Right, a pixel shader compiler - amazing.

Sadly, I don't think the project is being worked on anymore. But lots of very smart ideas to give some food for thought.