Browse Source

Merge pull request #851 from jkoritzinsky/WindowIcon-MatchPattern

Update icon save implementation and added test case to control catalog
Steven Kirk 9 years ago
parent
commit
b083899720

+ 5 - 1
samples/ControlCatalog/Pages/ImagePage.xaml

@@ -34,6 +34,10 @@
                Width="100" Height="200"
                Stretch="UniformToFill"/>
       </StackPanel>
-    </StackPanel>    
+    </StackPanel>
+    <StackPanel Orientation="Vertical">
+      <TextBlock>Window Icon as an Image</TextBlock>
+      <Image Name="Icon" Width="100" Height="200" Stretch="None" />
+    </StackPanel>
   </StackPanel>
 </UserControl>

+ 23 - 0
samples/ControlCatalog/Pages/ImagePage.xaml.cs

@@ -1,10 +1,14 @@
+using System.IO;
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Markup.Xaml;
+using Avalonia.Media.Imaging;
 
 namespace ControlCatalog.Pages
 {
     public class ImagePage : UserControl
     {
+        private Image iconImage;
         public ImagePage()
         {
             this.InitializeComponent();
@@ -13,6 +17,25 @@ namespace ControlCatalog.Pages
         private void InitializeComponent()
         {
             AvaloniaXamlLoader.Load(this);
+            iconImage = this.Get<Image>("Icon");
+        }
+
+        protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
+        {
+            base.OnAttachedToVisualTree(e);
+            if (iconImage.Source == null)
+            {
+                var windowRoot = e.Root as Window;
+                if (windowRoot != null)
+                {
+                    using (var stream = new MemoryStream())
+                    {
+                        windowRoot.Icon.Save(stream);
+                        stream.Seek(0, SeekOrigin.Begin);
+                        iconImage.Source = new Bitmap(stream);
+                    }
+                }
+            }
         }
     }
 }

+ 2 - 4
src/Android/Avalonia.Android/PlatformIconLoader.cs

@@ -49,11 +49,9 @@ namespace Avalonia.Android
             stream.CopyTo(this.stream);
         }
 
-        public Stream Save()
+        public void Save(Stream outputStream)
         {
-            var returnStream = new MemoryStream();
-            stream.CopyTo(returnStream);
-            return returnStream;
+            stream.CopyTo(outputStream);
         }
     }
 }

+ 1 - 1
src/Avalonia.Controls/Platform/IWindowIconImpl.cs

@@ -7,6 +7,6 @@ namespace Avalonia.Platform
 {
     public interface IWindowIconImpl
     {
-        Stream Save();
+        void Save(Stream outputStream);
     }
 }

+ 1 - 1
src/Avalonia.Controls/WindowIcon.cs

@@ -31,6 +31,6 @@ namespace Avalonia.Controls
 
         public IWindowIconImpl PlatformImpl { get; }
 
-        public Stream Save() => PlatformImpl.Save();
+        public void Save(Stream stream) => PlatformImpl.Save(stream);
     }
 }

+ 3 - 2
src/Gtk/Avalonia.Gtk/IconImpl.cs

@@ -18,9 +18,10 @@ namespace Avalonia.Gtk
 
         public Pixbuf Pixbuf { get; }
 
-        public Stream Save()
+        public void Save(Stream stream)
         {
-            return new MemoryStream(Pixbuf.SaveToBuffer("png"));
+            var buffer = Pixbuf.SaveToBuffer("png");
+            stream.Write(buffer, 0, buffer.Length);
         }
     }
 }

+ 3 - 5
src/Windows/Avalonia.Win32/IconImpl.cs

@@ -27,18 +27,16 @@ namespace Avalonia.Win32
 
         public IntPtr HIcon => icon?.Handle ?? bitmap.GetHicon();
 
-        public Stream Save()
+        public void Save(Stream outputStream)
         {
-            var stream = new MemoryStream();
             if (icon != null)
             {
-                icon.Save(stream);
+                icon.Save(outputStream);
             }
             else
             {
-                bitmap.Save(stream, ImageFormat.Png);
+                bitmap.Save(outputStream, ImageFormat.Png);
             }
-            return stream;
         }
     }
 }

+ 3 - 5
src/iOS/Avalonia.iOS/PlatformIconLoader.cs

@@ -31,18 +31,16 @@ namespace Avalonia.iOS
     // Stores the icon created as a stream to support saving even though an icon is never shown
     public class FakeIcon : IWindowIconImpl
     {
-        private Stream stream = new MemoryStream();
+        private readonly Stream stream = new MemoryStream();
 
         public FakeIcon(Stream stream)
         {
             stream.CopyTo(this.stream);
         }
 
-        public Stream Save()
+        public void Save(Stream outputStream)
         {
-            var returnStream = new MemoryStream();
-            stream.CopyTo(returnStream);
-            return returnStream;
+            stream.CopyTo(outputStream);
         }
     }
 }