浏览代码

Move print preview initialization to after window is shown

Ruben 9 小时之前
父节点
当前提交
63b7b0541b

+ 3 - 8
src/PicView.Avalonia.Win32/Views/PrintPreviewWindow.axaml.cs

@@ -69,15 +69,10 @@ public partial class PrintPreviewWindow : Window
     private void Close(object? sender, RoutedEventArgs e) => Close();
     private void Minimize(object? sender, RoutedEventArgs e) => WindowState = WindowState.Minimized;
 
-    protected override void OnLoaded(RoutedEventArgs e)
+    public void Initialize()
     {
-        base.OnLoaded(e);
-
-        if (DataContext is not MainViewModel vm)
-        {
-            return;
-        }
-
+        var vm = Dispatcher.UIThread.Invoke(() => DataContext as MainViewModel);
+        
         if (vm.PrintPreview == null)
         {
             return;

+ 38 - 27
src/PicView.Avalonia.Win32/WindowImpl/WindowInitializer.cs

@@ -461,33 +461,6 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
                 // TODO: Move this initialization to its own dedicated class
 
-                var printerSettings = new PrinterSettings();
-
-                // Load installed printers
-                vm.PrintPreview.Printers.Value = new List<string>(PrinterSettings.InstalledPrinters);
-                vm.PrintPreview.PaperSizes.Value = new List<string>(PrintEngine.GetPaperSizes(printerSettings.PrinterName));
-
-
-                // Pre-select default printer settings
-                var pageSettings = printerSettings.DefaultPageSettings;
-
-                var currentPrintSettings =
-                    new PrintSettings // TODO: Add print settings to its own config class to remember user preference
-                {
-                    ImagePath = { Value = vm.PicViewer.FileInfo?.Value?.FullName },
-                    PrinterName = { Value = printerSettings.PrinterName },
-                    PaperSize = { Value = pageSettings.PaperSize.PaperName },
-                    ColorMode = { Value = printerSettings.SupportsColor ? (int)ColorModes.Auto : (int)ColorModes.BlackAndWhite },
-                    Orientation = { Value = pageSettings.Landscape ? (int)Orientations.Landscape : (int)Orientations.Portrait },
-                    MarginTop = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Top) },
-                    MarginBottom = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Bottom) },
-                    MarginLeft = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Left) },
-                    MarginRight = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Right) }
-                };
-
-                vm.PrintPreview.PrintSettings.Value = currentPrintSettings;
-                vm.PrintPreview.PreviewImage.Value = vm.PicViewer.ImageSource.CurrentValue;
-
                 _printPreviewWindow = new PrintPreviewWindow
                 {
                     DataContext = vm,
@@ -507,6 +480,44 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
                 _printPreviewWindow.Show(desktop.MainWindow);
                 _printPreviewWindow.Closing += (_, _) => _printPreviewWindow = null;
+
+                Task.Run(() =>
+                {
+                    var printerSettings = new PrinterSettings();
+
+                    // Load installed printers
+                    vm.PrintPreview.Printers.Value = new List<string>(PrinterSettings.InstalledPrinters);
+                    vm.PrintPreview.PaperSizes.Value = new List<string>(PrintEngine.GetPaperSizes(printerSettings.PrinterName));
+
+
+                    // Pre-select default printer settings
+                    var pageSettings = printerSettings.DefaultPageSettings;
+
+                    var currentPrintSettings =
+                        new PrintSettings // TODO: Add print settings to its own config class to remember user preference
+                    {
+                        ImagePath = { Value = vm.PicViewer.FileInfo?.Value?.FullName },
+                        PrinterName = { Value = printerSettings.PrinterName },
+                        PaperSize = { Value = pageSettings.PaperSize.PaperName },
+                        ColorMode = { Value = printerSettings.SupportsColor ? (int)ColorModes.Auto : (int)ColorModes.BlackAndWhite },
+                        Orientation = { Value = pageSettings.Landscape ? (int)Orientations.Landscape : (int)Orientations.Portrait },
+                        MarginTop = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Top) },
+                        MarginBottom = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Bottom) },
+                        MarginLeft = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Left) },
+                        MarginRight = { Value = PrintSettings.HundredthsInchToMm(pageSettings.Margins.Right) }
+                    };
+
+                    vm.PrintPreview.PrintSettings.Value = currentPrintSettings;
+                    
+                    // TODO: set a blank image at correct size first, and then update it with real image, to avoid resizing
+                    if (vm.PicViewer.FileInfo.Value != null && File.Exists(vm.PicViewer.FileInfo.Value.FullName))
+                    {
+                        using var fs = File.OpenRead(vm.PicViewer.FileInfo.Value.FullName);
+                        vm.PrintPreview.PreviewImage.Value = new System.Drawing.Bitmap(fs);
+                    }
+                    
+                    _printPreviewWindow.Initialize();
+                });
             }
             else
             {