Frank.Wpf.Hosting
1.5.0
See the version list below for details.
dotnet add package Frank.Wpf.Hosting --version 1.5.0
NuGet\Install-Package Frank.Wpf.Hosting -Version 1.5.0
<PackageReference Include="Frank.Wpf.Hosting" Version="1.5.0" />
paket add Frank.Wpf.Hosting --version 1.5.0
#r "nuget: Frank.Wpf.Hosting, 1.5.0"
// Install Frank.Wpf.Hosting as a Cake Addin #addin nuget:?package=Frank.Wpf.Hosting&version=1.5.0 // Install Frank.Wpf.Hosting as a Cake Tool #tool nuget:?package=Frank.Wpf.Hosting&version=1.5.0
Frank.Wpf.Hosting
Frank.Wpf.Hosting is a library that allows you to host WPF without XAML and using Dependency Injection.
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 | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0-windows7.0 is compatible. |
-
net8.0-windows7.0
- Microsoft.Extensions.Configuration (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
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 |