Browse Source

Allow GradientBrushes in XAML.

pull/145/head
Steven Kirk 11 years ago
parent
commit
fde9464816
  1. 9
      samples/XamlTestApplication/Views/MainWindow.xaml
  2. 3
      src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs
  3. 33
      src/Markup/Perspex.Markup.Xaml/Converters/ColorTypeConverter.cs
  4. 32
      src/Markup/Perspex.Markup.Xaml/Converters/PointTypeConverter.cs
  5. 2
      src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj
  6. 24
      src/Perspex.SceneGraph/Point.cs
  7. 2
      src/Perspex.SceneGraph/Properties/AssemblyInfo.cs
  8. 18
      src/Perspex.SceneGraph/Thickness.cs

9
samples/XamlTestApplication/Views/MainWindow.xaml

@ -2,6 +2,7 @@
xmlns="https://github.com/perspex"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Perspex Test Application" Height="350" Width="525">
<Grid RowDefinitions="Auto,*">
<TabControl Grid.Row="1">
<TabItem Header="Buttons">
@ -101,7 +102,13 @@
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border Width="100" Height="100" Background="Crimson">
<Border Width="100" Height="100">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Red" Offset="0"/>
<GradientStop Color="Green" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<TextBox HorizontalAlignment="Center" VerticalAlignment="Center" Text="hello!"></TextBox>
</Border>
<Border Grid.Row="0" Grid.Column="1" Background="Coral" HorizontalAlignment="Center"

3
src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs

@ -77,9 +77,11 @@ namespace Perspex.Markup.Xaml.Context
{
new TypeConverterRegistration(typeof(Bitmap), new BitmapTypeConverter()),
new TypeConverterRegistration(typeof(Brush), new BrushTypeConverter()),
new TypeConverterRegistration(typeof(Color), new ColorTypeConverter()),
new TypeConverterRegistration(typeof(Classes), new ClassesTypeConverter()),
new TypeConverterRegistration(typeof(ColumnDefinitions), new ColumnDefinitionsTypeConverter()),
new TypeConverterRegistration(typeof(GridLength), new GridLengthTypeConverter()),
new TypeConverterRegistration(typeof(Point), new PointTypeConverter()),
new TypeConverterRegistration(typeof(PerspexProperty), new PerspexPropertyTypeConverter()),
new TypeConverterRegistration(typeof(RowDefinitions), new RowDefinitionsTypeConverter()),
new TypeConverterRegistration(typeof(Thickness), new ThicknessTypeConverter()),
@ -98,6 +100,7 @@ namespace Perspex.Markup.Xaml.Context
new ContentPropertyDefinition(typeof(ContentControl), "Content"),
new ContentPropertyDefinition(typeof(Decorator), "Child"),
new ContentPropertyDefinition(typeof(ItemsControl), "Items"),
new ContentPropertyDefinition(typeof(GradientBrush), "GradientStops"),
new ContentPropertyDefinition(typeof(Panel), "Children"),
new ContentPropertyDefinition(typeof(Style), "Setters"),
new ContentPropertyDefinition(typeof(TextBlock), "Text"),

33
src/Markup/Perspex.Markup.Xaml/Converters/ColorTypeConverter.cs

@ -0,0 +1,33 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using OmniXaml.TypeConversion;
using Perspex.Media;
namespace Perspex.Markup.Xaml.Converters
{
public class ColorTypeConverter : ITypeConverter
{
public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType)
{
return false;
}
public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value)
{
return Color.Parse((string)value);
}
public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)
{
throw new NotImplementedException();
}
}
}

32
src/Markup/Perspex.Markup.Xaml/Converters/PointTypeConverter.cs

@ -0,0 +1,32 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using OmniXaml.TypeConversion;
namespace Perspex.Markup.Xaml.Converters
{
public class PointTypeConverter : ITypeConverter
{
public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType)
{
return false;
}
public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value)
{
return Point.Parse((string)value, culture);
}
public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)
{
throw new NotImplementedException();
}
}
}

2
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@ -38,6 +38,8 @@
<Compile Include="..\..\Shared\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Converters\ColorTypeConverter.cs" />
<Compile Include="Converters\PointTypeConverter.cs" />
<Compile Include="Converters\ClassesTypeConverter.cs" />
<Compile Include="Converters\RowDefinitionsTypeConverter.cs" />
<Compile Include="Converters\ColumnDefinitionsTypeConverter.cs" />

24
src/Perspex.SceneGraph/Point.cs

@ -1,7 +1,9 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using System.Linq;
namespace Perspex
{
@ -139,6 +141,28 @@ namespace Perspex
(point.X * matrix.M12) + (point.Y * matrix.M22) + matrix.M32);
}
/// <summary>
/// Parses a <see cref="Point"/> string.
/// </summary>
/// <param name="s">The string.</param>
/// <param name="culture">The current culture.</param>
/// <returns>The <see cref="Thickness"/>.</returns>
public static Point Parse(string s, CultureInfo culture)
{
var parts = s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim())
.ToList();
if (parts.Count == 2)
{
return new Point(double.Parse(parts[0], culture), double.Parse(parts[1], culture));
}
else
{
throw new FormatException("Invalid Thickness.");
}
}
/// <summary>
/// Checks for equality between a point and an object.
/// </summary>

2
src/Perspex.SceneGraph/Properties/AssemblyInfo.cs

@ -2,5 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Reflection;
using Perspex.Metadata;
[assembly: AssemblyTitle("Perspex.SceneGraph")]
[assembly: XmlnsDefinition("https://github.com/perspex", "Perspex.Media")]

18
src/Perspex.SceneGraph/Thickness.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using System.Linq;
namespace Perspex
@ -168,8 +169,9 @@ namespace Perspex
/// Parses a <see cref="Thickness"/> string.
/// </summary>
/// <param name="s">The string.</param>
/// <param name="culture">The current culture.</param>
/// <returns>The <see cref="Thickness"/>.</returns>
public static Thickness Parse(string s)
public static Thickness Parse(string s, CultureInfo culture)
{
var parts = s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim())
@ -178,17 +180,17 @@ namespace Perspex
switch (parts.Count)
{
case 1:
var uniform = double.Parse(parts[0]);
var uniform = double.Parse(parts[0], culture);
return new Thickness(uniform);
case 2:
var horizontal = double.Parse(parts[0]);
var vertical = double.Parse(parts[1]);
var horizontal = double.Parse(parts[0], culture);
var vertical = double.Parse(parts[1], culture);
return new Thickness(horizontal, vertical);
case 4:
var left = double.Parse(parts[0]);
var top = double.Parse(parts[1]);
var right = double.Parse(parts[2]);
var bottom = double.Parse(parts[3]);
var left = double.Parse(parts[0], culture);
var top = double.Parse(parts[1], culture);
var right = double.Parse(parts[2], culture);
var bottom = double.Parse(parts[3], culture);
return new Thickness(left, top, right, bottom);
}

Loading…
Cancel
Save