Frank.Wpf.Hosting 2.0.0-preview

This is a prerelease version of Frank.Wpf.Hosting.
There is a newer version of this package available.
See the version list below for details.
dotnet add package Frank.Wpf.Hosting --version 2.0.0-preview                
NuGet\Install-Package Frank.Wpf.Hosting -Version 2.0.0-preview                
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="Frank.Wpf.Hosting" Version="2.0.0-preview" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Frank.Wpf.Hosting --version 2.0.0-preview                
#r "nuget: Frank.Wpf.Hosting, 2.0.0-preview"                
#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 Frank.Wpf.Hosting as a Cake Addin
#addin nuget:?package=Frank.Wpf.Hosting&version=2.0.0-preview&prerelease

// Install Frank.Wpf.Hosting as a Cake Tool
#tool nuget:?package=Frank.Wpf.Hosting&version=2.0.0-preview&prerelease                

Frank.Wpf.Hosting

Frank.Wpf.Hosting is a library that allows you to host WPF without XAML and using Dependency Injection.



NuGet NuGet


Features

  • Dependency Injection
  • No XAML
  • Multiple windows

Installation

dotnet add package Frank.Wpf.Hosting

Usage

using Frank.Wpf.Hosting;

public static class Program
{
    [STAThread] // Required for WPF
    public static void Main()
    {
        var builder = Host.CreateWpfHostBuilder(); // Create a WPF host builder
        builder.Services.AddTransient<IMyService, MyService>(); // Register services
        var host = builder.Build<MyWindow>(); // Create the host with the window inheriting from MainWindow
        host.Run(); // Start the application and show the window
    }
}

To get this point you need to create a window that inherits from MainWindow:

using Frank.Wpf.Hosting;

public class MyWindow : MainWindow
{
    public MyWindow(IMyService myService)
    {
        // Use the service
    }
}

Advanced usage

If you want to have multiple windows, and not just dialogs, you can use the IWindowFactory interface:

using Frank.Wpf.Hosting;

public class MyService : IMyService
{
    private readonly IWindowFactory _windowFactory;

    public MyService(IWindowFactory windowFactory)
    {
        _windowFactory = windowFactory;
    }

    public void DoSomething()
    {
        _windowFactory.CreateWindow<OtherWindow>(true); // Create a new window and show it (true)
    }
}

You can also get the window by name using the IWindowFactory interface:

using Frank.Wpf.Hosting;

public class MyService : IMyService
{
    private readonly IWindowFactory _windowFactory;

    public MyService(IWindowFactory windowFactory)
    {
        _windowFactory = windowFactory;
    }

    public void DoSomething()
    {
        _windowFactory.CreateWindow("DisplayWindow", true); // Create a new window and show it (true)
    }
}

Note: The window name is the actual property name of the window, not the class name.

If you want to share data between windows, you can use the IApplicationCache interface, and access it using the Dispatcher directly when needed:

using Frank.Wpf.Hosting;

public class DisplayWindow : Window
{
    private readonly IApplicationCache _cache;
    private readonly Label _label;
    private readonly Timer _timer;
    
    public DisplayWindow(IApplicationCache cache)
    {
        _cache = cache;
        Title = "Hello, World!";
        Name = "DisplayWindow";
        Width = 800;
        Height = 600;
        
        _label = new Label
        {
            Content = "Hello, World!"
        };
        
        Content = _label;
        
        _timer = new Timer(1000);
        _timer.Elapsed += (_, _) => UpdateLabel();
        _timer.Start();
    }

    private void UpdateLabel() => Dispatcher.Invoke(() => _label.Content = _cache.Get<string>("message")); // Access the cache using the Dispatcher because the timer runs on a different thread
}

public class InputWindow : Window
{
    private readonly IApplicationCache _cache;
    private readonly TextBox _textBox;
    
    public InputWindow(IApplicationCache cache)
    {
        _cache = cache;
        Title = "Hello, World!";
        Width = 800;
        Height = 600;
        
        _textBox = new TextBox();
        
        var button = new Button
        {
            Content = "Set message"
        };
        
        button.Click += (sender, args) => _cache.Set("message", _textBox.Text);
        
        Content = new StackPanel
        {
            Children =
            {
                _textBox,
                button
            }
        };
    }
}
Product Compatible and additional computed target framework versions.
.NET net8.0-windows7.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Frank.Wpf.Hosting:

Package Downloads
Frank.Wpf.Tests.App

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
5.3.0 120 8/18/2024
5.2.0 126 8/17/2024
5.2.0-preview 94 8/18/2024
5.1.0 103 8/17/2024
5.1.0-preview 100 8/17/2024
5.0.0 118 8/16/2024
5.0.0-preview 99 8/17/2024
4.0.0 117 8/15/2024
4.0.0-preview 96 8/15/2024
3.1.0 111 8/12/2024
3.1.0-preview 96 8/14/2024
3.0.0 113 8/12/2024
3.0.0-preview 103 8/12/2024
2.3.0 110 8/12/2024
2.3.0-preview 98 8/12/2024
2.2.0 97 8/7/2024
2.2.0-preview 94 8/12/2024
2.1.0 66 8/5/2024
2.1.0-preview 54 8/5/2024
2.0.0 60 8/4/2024
2.0.0-preview 55 8/5/2024
1.5.0 110 7/20/2024
1.5.0-preview 58 8/4/2024
1.0.0 91 7/19/2024
1.0.0-preview 94 7/20/2024
0.3.0 100 7/19/2024
0.3.0-preview 79 7/19/2024
0.2.0-preview 83 7/19/2024