[XamlC] allow xml-elements as Setter/Trigger Values (#684)

This commit is contained in:
Stephane Delcroix 2017-01-25 15:09:54 +01:00 коммит произвёл GitHub
Родитель f30aa8ae2c
Коммит ca7f2caf57
5 изменённых файлов: 80 добавлений и 2 удалений

Просмотреть файл

@ -5,6 +5,7 @@ using Mono.Cecil.Cil;
using Xamarin.Forms.Xaml;
using Xamarin.Forms.Build.Tasks;
using System.Xml;
namespace Xamarin.Forms.Core.XamlC
{
@ -12,7 +13,12 @@ namespace Xamarin.Forms.Core.XamlC
{
public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefref, ModuleDefinition module, BaseNode node, ILContext context)
{
var valueNode = ((IElementNode)node).Properties[new XmlName("", "Value")];
INode valueNode = null;
if (!((IElementNode)node).Properties.TryGetValue(new XmlName("", "Value"), out valueNode) && ((IElementNode)node).CollectionItems.Count == 1)
valueNode = ((IElementNode)node).CollectionItems[0];
if (valueNode == null)
throw new XamlParseException("Missing Value for Setter", (IXmlLineInfo)node);
//if it's an elementNode, there's probably no need to convert it
if (valueNode is IElementNode)

Просмотреть файл

@ -5,6 +5,7 @@ using Mono.Cecil.Cil;
using Xamarin.Forms.Xaml;
using Xamarin.Forms.Build.Tasks;
using System.Xml;
namespace Xamarin.Forms.Core.XamlC
{
@ -12,7 +13,12 @@ namespace Xamarin.Forms.Core.XamlC
{
public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefref, ModuleDefinition module, BaseNode node, ILContext context)
{
var valueNode = ((IElementNode)node).Properties[new XmlName("", "Value")];
INode valueNode = null;
if (!((IElementNode)node).Properties.TryGetValue(new XmlName("", "Value"), out valueNode) && ((IElementNode)node).CollectionItems.Count == 1)
valueNode = ((IElementNode)node).CollectionItems[0];
if (valueNode == null)
throw new XamlParseException("Missing Value for Trigger", (IXmlLineInfo)node);
//if it's an elementNode, there's probably no need to convert it
if (valueNode is IElementNode)

Просмотреть файл

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Xamarin.Forms.Xaml.UnitTests.Bz51567">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="ListText" TargetType="Label">
<Setter Property="TextColor" Value="Black" />
<Setter Property="FontSize">
<OnPlatform x:TypeArguments="x:Double" iOS="17" Android="17" WinPhone="20" />
</Setter>
</Style>
</ResourceDictionary>
</ContentPage.Resources>
</ContentPage>

Просмотреть файл

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using NUnit.Framework;
using Xamarin.Forms;
using Xamarin.Forms.Core.UnitTests;
namespace Xamarin.Forms.Xaml.UnitTests
{
public partial class Bz51567 : ContentPage
{
public Bz51567()
{
InitializeComponent();
}
public Bz51567(bool useCompiledXaml)
{
//this stub will be replaced at compile time
}
[TestFixture]
class Tests
{
[SetUp]
public void Setup()
{
Device.PlatformServices = new MockPlatformServices();
}
[TearDown]
public void TearDown()
{
Device.PlatformServices = null;
}
[TestCase(true)]
[TestCase(false)]
public void SetterWithElementValue(bool useCompiledXaml)
{
var page = new Bz51567(useCompiledXaml);
var style = page.Resources["ListText"] as Style;
var setter = style.Setters[1];
Assert.NotNull(setter);
}
}
}
}

Просмотреть файл

@ -409,6 +409,9 @@
<Compile Include="Issues\Bz45179.xaml.cs">
<DependentUpon>Bz45179.xaml</DependentUpon>
</Compile>
<Compile Include="Issues\Bz51567.xaml.cs">
<DependentUpon>Bz51567.xaml</DependentUpon>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="..\.nuspec\Xamarin.Forms.Debug.targets" />
@ -739,6 +742,9 @@
<EmbeddedResource Include="Issues\Bz45179.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="Issues\Bz51567.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />