HostedWPF 3.1.0

dotnet add package HostedWPF --version 3.1.0
NuGet\Install-Package HostedWPF -Version 3.1.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="HostedWPF" Version="3.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add HostedWPF --version 3.1.0
#r "nuget: HostedWPF, 3.1.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install HostedWPF as a Cake Addin
#addin nuget:?package=HostedWPF&version=3.1.0

// Install HostedWPF as a Cake Tool
#tool nuget:?package=HostedWPF&version=3.1.0

HostedWPF

Base classes for windows, pages and controls using MVVM and dependency injection.

App Template

You can use this template as a replacement for your existing App.cs:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using HostedWpf;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace MyApp
{
    public partial class App
    {
        public new static App Current => BaseApp.Current as App ?? throw new ApplicationException("Current Application is not an App instance!");
        
        /// <inheritdoc />
        protected override IHostBuilder ConfigureHost(IHostBuilder builder) => builder
                .ConfigureServices(services => services
                    .AddTransient<MainWindowViewModel>()
                    .AddTransient<MainWindow>()
                )
                .ConfigureLogging(builder => builder.AddSimpleConsole());

        /// <inheritdoc />
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // explicitly set which window is the main window in startup
            MainWindow = Services.GetRequiredService<MainWindow>();
            MainWindow.Show();
        }
    }
}

You will also need to make some adjustments to your Windows. This is a replacement for your MainWindow.xaml.cs:

using HostedWpf.Windows;

using MyApp.ViewModels;

namespace MyApp
{
    /// <summary>
    /// Since BaseWindow from HostedWPF is generic, it cannot be used in XAML. This intermediate class is needed for the WPF designer to work.
    /// </summary>
    public partial class BaseMainWindow : BaseWindow<MainWindowViewModel>
    {
    }
    
    /// <summary>
    /// MainWindow extends BaseMainWindow in the generated code.
    /// </summary>
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

And this for your MainWindow.xaml:

<local:BaseMainWindow x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp"
        xmlns:viewmodels="clr-namespace:MyApp.ViewModels"
        d:DataContext="{d:DesignInstance Type=viewmodels:MainWindowViewModel}"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>

    </Grid>
</local:BaseMainWindow>

And last, but not least, you will need to create a view model for your MainWindow located at ViewModels\MainWindowViewMode.cs:

using HostedWpf.ViewModels;

namespace MyApp.ViewModels
{
    public class MainWindowViewModel : BaseViewModel
    {
        public MainWindowViewModel()
        {
        }
    }
}

You can now use the constructors of every window and view model to access services registered in your app. Of course, you can also craft windows yourself and you don't have to use HostedWPF.BaseWindow for all your windows.

HostedWPF provides all benefits from dependency injection you already know and love from (ASP).NET Core services.

The view models also provide code completion for the XAML designer, so you can easily design and develop while creating your views. BaseViewModel implements INotifyPropertyChanged, so you don't have to implement it yourself every time. It also provides some convenient methods like SetProperty<T> which you can use in your property setters to update values displayed in your view.

Product Compatible and additional computed target framework versions.
.NET net6.0-windows7.0 is compatible.  net7.0-windows was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
3.1.0 275 12/28/2021
3.0.0 304 10/13/2021
2.0.3 291 10/12/2021
2.0.2 290 10/12/2021
2.0.1 286 10/12/2021
2.0.0 280 10/12/2021
1.0.0 289 10/10/2021