diff --git a/samples/ControlCatalog/Pages/ImagePage.xaml b/samples/ControlCatalog/Pages/ImagePage.xaml
index 1aaedc4420..dc93808f27 100644
--- a/samples/ControlCatalog/Pages/ImagePage.xaml
+++ b/samples/ControlCatalog/Pages/ImagePage.xaml
@@ -34,6 +34,10 @@
Width="100" Height="200"
Stretch="UniformToFill"/>
-
+
+
+ Window Icon as an Image
+
+
\ No newline at end of file
diff --git a/samples/ControlCatalog/Pages/ImagePage.xaml.cs b/samples/ControlCatalog/Pages/ImagePage.xaml.cs
index cc35b4d237..792b25963e 100644
--- a/samples/ControlCatalog/Pages/ImagePage.xaml.cs
+++ b/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("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);
+ }
+ }
+ }
}
}
}
diff --git a/src/Android/Avalonia.Android/PlatformIconLoader.cs b/src/Android/Avalonia.Android/PlatformIconLoader.cs
index 11fc5583a5..289025ce1d 100644
--- a/src/Android/Avalonia.Android/PlatformIconLoader.cs
+++ b/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);
}
}
}
\ No newline at end of file
diff --git a/src/Avalonia.Controls/Platform/IWindowIconImpl.cs b/src/Avalonia.Controls/Platform/IWindowIconImpl.cs
index cd339ff404..d106e2a616 100644
--- a/src/Avalonia.Controls/Platform/IWindowIconImpl.cs
+++ b/src/Avalonia.Controls/Platform/IWindowIconImpl.cs
@@ -7,6 +7,6 @@ namespace Avalonia.Platform
{
public interface IWindowIconImpl
{
- Stream Save();
+ void Save(Stream outputStream);
}
}
diff --git a/src/Avalonia.Controls/WindowIcon.cs b/src/Avalonia.Controls/WindowIcon.cs
index debac7c981..dff84ff6ef 100644
--- a/src/Avalonia.Controls/WindowIcon.cs
+++ b/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);
}
}
diff --git a/src/Gtk/Avalonia.Gtk/IconImpl.cs b/src/Gtk/Avalonia.Gtk/IconImpl.cs
index a3cf3be47a..3203e59f21 100644
--- a/src/Gtk/Avalonia.Gtk/IconImpl.cs
+++ b/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);
}
}
}
diff --git a/src/Windows/Avalonia.Win32/IconImpl.cs b/src/Windows/Avalonia.Win32/IconImpl.cs
index b9e3378b6f..b7293397d7 100644
--- a/src/Windows/Avalonia.Win32/IconImpl.cs
+++ b/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;
}
}
}
diff --git a/src/iOS/Avalonia.iOS/PlatformIconLoader.cs b/src/iOS/Avalonia.iOS/PlatformIconLoader.cs
index dc9d87660f..ca54a660b3 100644
--- a/src/iOS/Avalonia.iOS/PlatformIconLoader.cs
+++ b/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);
}
}
}
\ No newline at end of file