I want to use resource dictionary and app context to render a WPF GUI in PowerShell core (7.5) and .NET 9.
here is the main.xml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window" Title="WPF Example" Height="200" Width="400">
<StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBox x:Name="MyTextBox" Width="150" Style="{StaticResource TextBoxStyle}"/>
<Button x:Name="SubmitButton" Content="Submit" Margin="5" Style="{StaticResource ButtonStyle}"/>
</StackPanel>
</StackPanel>
</Window>
Here is the App.Xaml
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Main.xml">
<Application.Resources>
<Style x:Key="TextBoxStyle" TargetType="TextBox">
<Setter Property="FontSize" Value="14"/>
<Setter Property="Margin" Value="5"/>
</Style>
<Style x:Key="ButtonStyle" TargetType="Button">
<Setter Property="Background" Value="LightBlue"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Margin" Value="5"/>
</Style>
</Application.Resources>
</Application>
Here is the PowerShell script, all files in the same directory.
Add-Type -AssemblyName PresentationFramework
[xml]$MainXML = Get-Content -Raw -Path .Main.xml
$MainReader = New-Object -TypeName 'System.Xml.XmlNodeReader' -ArgumentList $MainXML
$MainWindow = [System.Windows.Markup.XamlReader]::Load($MainReader)
$App = [System.Windows.Application]::new()
$resourceDictionary = [System.Windows.ResourceDictionary]::new()
$resourceDictionary.Source = [System.Uri]::new("pack://application:,,,/App.xaml")
$App.Resources.MergedDictionaries.Add($resourceDictionary)
$App.MainWindow = $MainWindow
$MainWindow.Show()
$App.Run()
after running it i get this error
$MainWindow = [System.Windows.Markup.XamlReader]::Load($MainReader)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "Load" with "1" argument(s): "Provide value on 'System.Windows.StaticResourceExtension' threw an exception."
InvalidOperation:
I tried changing them, for example I tried using this XML
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window" Title="WPF Example" Height="200" Width="400">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/App.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBox x:Name="MyTextBox" Width="150" Style="{StaticResource TextBoxStyle}"/>
<Button x:Name="SubmitButton" Content="Submit" Margin="5" Style="{StaticResource ButtonStyle}"/>
</StackPanel>
</StackPanel>
</Window>
with this PowerShell script
Add-Type -AssemblyName PresentationFramework
[xml]$MainXML = Get-Content -Raw -Path .Main.xml
$MainReader = New-Object -TypeName 'System.Xml.XmlNodeReader' -ArgumentList $MainXML
$MainWindow = [System.Windows.Markup.XamlReader]::Load($MainReader)
$App = [System.Windows.Application]::new()
$App.MainWindow = $MainWindow
$MainWindow.Show()
$App.Run()
but still getting the same error
my ultimate goal is to get this to work in PowerShell WPF GUI
https://github.com/dotnet/core/blob/main/release-notes/9.0/preview/preview4/wpf.md
which relies on this
Add-Type -Path "C:Program FilesdotnetsharedMicrosoft.WindowsDesktop.App9.0.0-preview.6.24327.6PresentationFramework.Fluent.dll"