Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase # Import Custom Modules Import-Module (Join-Path $PSScriptRoot "Modules\SQLManager.psm1") -Force # Configuration Paths $configPath = Join-Path $PSScriptRoot "Config\settings.json" # Load Settings if (Test-Path $configPath) { $settings = Get-Content $configPath | ConvertFrom-Json } else { $settings = [pscustomobject]@{ LastServer = ""; Theme = "Light" } } # 1. Path to XAML $xamlFile = Join-Path $PSScriptRoot "UI\MainWindow.xaml" # 2. Load XAML [xml]$xml = Get-Content $xamlFile $reader = New-Object System.Xml.XmlNodeReader($xml) $Window = [Windows.Markup.XamlReader]::Load($reader) # 3. Extract controls from XAML $btnConnect = $Window.FindName("btnConnect") $txtServerName = $Window.FindName("txtServerName") $txtLogs = $Window.FindName("txtLogs") $dgServerInfo = $Window.FindName("dgServerInfo") # Set initial values from settings $txtServerName.Text = $settings.LastServer # 4. Helper function for logging function Write-Log { param([string]$Message) $timestamp = Get-Date -Format "HH:mm:ss" $txtLogs.Dispatcher.Invoke({ $txtLogs.AppendText("[$timestamp] $Message`r`n") $txtLogs.ScrollToEnd() }) } # 5. Connection logic $btnConnect.Add_Click({ $server = $txtServerName.Text if ([string]::IsNullOrWhiteSpace($server)) { Write-Log "Error: Please enter a server name." return } $btnConnect.IsEnabled = $false Write-Log "Attempting to connect to $server..." # Save last server $settings.LastServer = $server $settings | ConvertTo-Json | Set-Content $configPath try { $result = Test-SQLConnection -ServerInstance $server if ($result.Success) { Write-Log "Connected successfully to $($result.Instance)!" $dgServerInfo.ItemsSource = @($result) | Select-Object Instance, Version, Edition, Status } else { Write-Log "Connection failed: $($result.Error)" } } catch { Write-Log "Critical Error: $($_.Exception.Message)" } finally { $btnConnect.IsEnabled = $true } }) # Startup Dependency Check try { Import-DBAToolBoxDependencies Write-Log "DBAToolBox started. dbatools module loaded." } catch { [System.Windows.MessageBox]::Show($_.Exception.Message, "Dependency Error", "OK", "Error") # In some environments ShowDialog might fail if no UI thread, but for WPF it should work. $Window.Close() } # 6. Show Window $Window.ShowDialog() | Out-Null