Browse Source

Merge branch 'master' into clean-resources

pull/9948/head
Nikita Tsukanov 3 years ago
committed by GitHub
parent
commit
7d9fdc0696
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      src/Avalonia.Base/Media/Geometry.cs
  2. 54
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs

34
src/Avalonia.Base/Media/Geometry.cs

@ -1,12 +1,16 @@
using System;
using Avalonia.Platform;
using System.ComponentModel;
using System.Globalization;
using Avalonia.Reactive;
namespace Avalonia.Media
{
/// <summary>
/// Defines a geometric shape.
/// </summary>
/// </summary>
[TypeConverter(typeof(GeometryTypeConverter))]
public abstract class Geometry : AvaloniaObject
{
/// <summary>
@ -201,4 +205,32 @@ namespace Avalonia.Media
return new CombinedGeometry(combineMode, geometry1, geometry2, transform);
}
}
public class GeometryTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
{
if (value is null)
{
throw GetConvertFromException(value);
}
string? source = value as string;
if (source != null)
{
return Geometry.Parse(source);
}
return base.ConvertFrom(context, culture, value);
}
}
}

54
tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Controls.Shapes;
using Avalonia.Media;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.Markup.Xaml.UnitTests.Converters
{
public class GeometryTypeConverterTests: XamlTestBase
{
public class StringDataViewModel
{
public string PathData { get; set; }
}
public class IntDataViewModel
{
public int PathData { get; set; }
}
[Theory]
[MemberData(nameof(Get_GeometryTypeConverter_Data))]
public void GeometryTypeConverter_Value_Work(object vm, bool nullData)
{
using(UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
<Window xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:c='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Converters;assembly=Avalonia.Markup.Xaml.UnitTests'>
<Path Name='path' Data='{Binding PathData}' Height='10' Width='10'/>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var path = window.FindControl<Path>("path");
window.DataContext = vm;
Assert.Equal(nullData, path.Data is null);
}
}
public static IEnumerable<object[]> Get_GeometryTypeConverter_Data()
{
yield return new object[] { new StringDataViewModel { }, true };
yield return new object[] { new StringDataViewModel { PathData = "M406.39,333.45l205.93,0" }, false };
yield return new object[] { new IntDataViewModel { }, true };
yield return new object[] { new IntDataViewModel { PathData = 100 }, true };
}
}
}
Loading…
Cancel
Save