diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index 874560a294..cbe2c62890 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -32,7 +32,11 @@
-
+
+
+
diff --git a/samples/ControlCatalog/Pages/ImagePage.xaml b/samples/ControlCatalog/Pages/ImagePage.xaml
index b44fac27cb..9b8f8af765 100644
--- a/samples/ControlCatalog/Pages/ImagePage.xaml
+++ b/samples/ControlCatalog/Pages/ImagePage.xaml
@@ -1,45 +1,52 @@
-
- Image
- Displays an image
-
-
-
- No Stretch
-
-
-
-
- Fill
-
-
+
+
+ Image
+ Displays an image
+
-
- Uniform
-
-
+
+
+
+ Bitmap
+
+ None
+ Fill
+ Uniform
+ UniformToFill
+
+
+
-
- UniformToFill
-
-
-
-
- Window Icon as an Image
-
-
-
+
+ Drawing
+
+ None
+ Fill
+ Uniform
+ UniformToFill
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/ImagePage.xaml.cs b/samples/ControlCatalog/Pages/ImagePage.xaml.cs
index 792b25963e..bbe89d1dfd 100644
--- a/samples/ControlCatalog/Pages/ImagePage.xaml.cs
+++ b/samples/ControlCatalog/Pages/ImagePage.xaml.cs
@@ -1,40 +1,41 @@
-using System.IO;
-using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-using Avalonia.Media.Imaging;
+using Avalonia.Media;
namespace ControlCatalog.Pages
{
public class ImagePage : UserControl
{
- private Image iconImage;
+ private readonly Image _bitmapImage;
+ private readonly Image _drawingImage;
+
public ImagePage()
{
- this.InitializeComponent();
+ InitializeComponent();
+ _bitmapImage = this.FindControl("bitmapImage");
+ _drawingImage = this.FindControl("drawingImage");
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
- iconImage = this.Get("Icon");
}
- protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
+ public void BitmapStretchChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (_bitmapImage != null)
+ {
+ var comboxBox = (ComboBox)sender;
+ _bitmapImage.Stretch = (Stretch)comboxBox.SelectedIndex;
+ }
+ }
+
+ public void DrawingStretchChanged(object sender, SelectionChangedEventArgs e)
{
- base.OnAttachedToVisualTree(e);
- if (iconImage.Source == null)
+ if (_drawingImage != 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);
- }
- }
+ var comboxBox = (ComboBox)sender;
+ _drawingImage.Stretch = (Stretch)comboxBox.SelectedIndex;
}
}
}
diff --git a/src/Avalonia.Controls/Image.cs b/src/Avalonia.Controls/Image.cs
index c2cdcb4e69..02014f4d31 100644
--- a/src/Avalonia.Controls/Image.cs
+++ b/src/Avalonia.Controls/Image.cs
@@ -14,8 +14,8 @@ namespace Avalonia.Controls
///
/// Defines the property.
///
- public static readonly StyledProperty SourceProperty =
- AvaloniaProperty.Register(nameof(Source));
+ public static readonly StyledProperty SourceProperty =
+ AvaloniaProperty.Register(nameof(Source));
///
/// Defines the property.
@@ -38,9 +38,9 @@ namespace Avalonia.Controls
}
///
- /// Gets or sets the bitmap image that will be displayed.
+ /// Gets or sets the image that will be displayed.
///
- public IBitmap Source
+ public IImage Source
{
get { return GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
@@ -75,7 +75,7 @@ namespace Avalonia.Controls
if (source != null)
{
Rect viewPort = new Rect(Bounds.Size);
- Size sourceSize = new Size(source.PixelSize.Width, source.PixelSize.Height);
+ Size sourceSize = source.Size;
Vector scale = Stretch.CalculateScaling(Bounds.Size, sourceSize, StretchDirection);
Size scaledSize = sourceSize * scale;
Rect destRect = viewPort
@@ -102,8 +102,7 @@ namespace Avalonia.Controls
if (source != null)
{
- var sourceSize = new Size(source.PixelSize.Width, source.PixelSize.Height);
- result = Stretch.CalculateSize(availableSize, sourceSize, StretchDirection);
+ result = Stretch.CalculateSize(availableSize, source.Size, StretchDirection);
}
return result;
@@ -116,7 +115,7 @@ namespace Avalonia.Controls
if (source != null)
{
- var sourceSize = new Size(source.PixelSize.Width, source.PixelSize.Height);
+ var sourceSize = source.Size;
var result = Stretch.CalculateSize(finalSize, sourceSize);
return result;
}
diff --git a/src/Avalonia.Visuals/Media/DrawingImage.cs b/src/Avalonia.Visuals/Media/DrawingImage.cs
index 594118d7de..9ddf88651c 100644
--- a/src/Avalonia.Visuals/Media/DrawingImage.cs
+++ b/src/Avalonia.Visuals/Media/DrawingImage.cs
@@ -1,4 +1,5 @@
-using Avalonia.Platform;
+using Avalonia.Metadata;
+using Avalonia.Platform;
using Avalonia.Visuals.Media.Imaging;
namespace Avalonia.Media
@@ -8,6 +9,7 @@ namespace Avalonia.Media
public static readonly StyledProperty DrawingProperty =
AvaloniaProperty.Register(nameof(Drawing));
+ [Content]
public Drawing Drawing
{
get => GetValue(DrawingProperty);
@@ -23,7 +25,26 @@ namespace Avalonia.Media
Rect destRect,
BitmapInterpolationMode bitmapInterpolationMode)
{
- Drawing?.Draw(context);
+ var drawing = Drawing;
+
+ if (drawing == null)
+ {
+ return;
+ }
+
+ var bounds = drawing.GetBounds();
+ var scale = Matrix.CreateScale(
+ destRect.Width / sourceRect.Width,
+ destRect.Height / sourceRect.Height);
+ var translate = Matrix.CreateTranslation(
+ -sourceRect.X + destRect.X - bounds.X,
+ -sourceRect.Y + destRect.Y - bounds.Y);
+
+ using (context.PushClip(destRect))
+ using (context.PushPreTransform(translate * scale))
+ {
+ Drawing?.Draw(context);
+ }
}
}
}
diff --git a/src/Avalonia.Visuals/Media/GeometryDrawing.cs b/src/Avalonia.Visuals/Media/GeometryDrawing.cs
index 3dad10fb8f..4df3aa8ae2 100644
--- a/src/Avalonia.Visuals/Media/GeometryDrawing.cs
+++ b/src/Avalonia.Visuals/Media/GeometryDrawing.cs
@@ -1,10 +1,13 @@
-namespace Avalonia.Media
+using Avalonia.Metadata;
+
+namespace Avalonia.Media
{
public class GeometryDrawing : Drawing
{
public static readonly StyledProperty GeometryProperty =
AvaloniaProperty.Register(nameof(Geometry));
+ [Content]
public Geometry Geometry
{
get => GetValue(GeometryProperty);
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs
index 63c8b1c074..ebe4035ed6 100644
--- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs
@@ -99,7 +99,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
void Add(string type, string conv)
=> AddType(typeSystem.GetType(type), typeSystem.GetType(conv));
- Add("Avalonia.Media.Imaging.IBitmap","Avalonia.Markup.Xaml.Converters.BitmapTypeConverter");
+ Add("Avalonia.Media.IImage","Avalonia.Markup.Xaml.Converters.BitmapTypeConverter");
var ilist = typeSystem.GetType("System.Collections.Generic.IList`1");
AddType(ilist.MakeGenericType(typeSystem.GetType("Avalonia.Point")),
typeSystem.GetType("Avalonia.Markup.Xaml.Converters.PointsListTypeConverter"));