Xamarin 3.3.0形成错误:从Xamarin 2.5迁移到3.3.0时存在很多问题

时间:2018-10-22 13:53:29

标签: c# xamarin

第一个问题:

我从以下位置更改了旧代码(以支持xamarin 3.0):

<OnPlatform x:Key="CrossPlatformStackOrientation" x:TypeArguments="StackOrientation">
          <On Platform="iOS" Value="Vertical"/>
          <On Platform="UWP" Value="Horizontal"/>
</OnPlatform>

<OnPlatform x:Key="CrossPlatformStackOrientation" x:TypeArguments="StackOrientation" iOS="Vertical" UWP="Horizontal" />

我遇到了以下错误:

  

找不到“ UWP”的属性,可绑定属性或事件,或者   值和属性之间的类型不匹配。

如果我删除x:TypeArguments,则不会发生任何错误,但是在运行时,我得到了

  

无法确定要为其提供值的属性

问题二:

我收到错误

  

预期为'}'

<Label Text="{Binding Description.CreationDateTime,Converter={StaticResource StringFormatConverter}, ConverterParameter='{0:dd-M-yyyy HH:mm:ss}'}"
                     Style="{StaticResource MyResourceText}" Grid.Row="0" Grid.Column="3" Margin="0,3,5,0"/>

问题三:

对于

<GridLength x:Key="TileSeparatorHeight">0</GridLength>

我知道了

  

“ GridLength”类型不支持直接内容。

它也发生在厚度上:

<Thickness x:Key="TileStartDatePadding">0,0,0,0</Thickness>

如何解决它们?

1 个答案:

答案 0 :(得分:0)

问题1,3的解决方法:

在您的应用中定义类:

public class XamlConsts
{
    public readonly Thickness TileStartDatePadding = new Thickness(0);
    public readonly GridLength TileSeparatorHeight = new GridLength(0);
    public StackOrientation CrossPlatformStackOrientation
    {
        get
        {
            switch (Device.RuntimePlatform)
            {
                case Device.UWP:
                    return StackOrientation.Horizontal;
                case Device.iOS:
                    return StackOrientation.Vertical;
                default: return StackOrientation.Horizontal;
            }
        }
    }

}

将其添加到资源中:

<local:XamlConsts x:Key="XamlConsts"></local:XamlConsts>

使用它:

<StackLayout Padding="{Binding Source={StaticResource XamlConsts},Path=TileStartDatePadding}"  Orientation="{Binding Source={StaticResource XamlConsts},Path=CrossPlatformStackOrientation}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="{Binding Source={StaticResource XamlConsts},Path=TileSeparatorHeight}"/>
            </Grid.RowDefinitions>

第一个问题

此方法不再有效,因为OnPlatform会从使用它的属性中推断类型,当您在资源中声明它时,它无法确定类型。

您可以使用其他方法: 1.定义转换器:

public class OrientationConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            switch (Device.RuntimePlatform)
            {
                case Device.UWP:
                    return StackOrientation.Horizontal;
                case Device.iOS:
                    return StackOrientation.Vertical;
                default: return StackOrientation.Horizontal;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

如何使用此转换器:

<local:OrientationConverter x:Key="CrossPlatformStackOrientationConverter"/>
<x:Int32 x:Key="intConst">1</x:Int32>
       </ContentPage.Resources>
    <StackLayout Orientation="{Binding Source={StaticResource intConst}, Converter={StaticResource CrossPlatformStackOrientationConverter}}">

其中“ 1”只是任何int常量,没有任何意义。

问题二

这是一个错误。

解决方法:

在资源中定义常量:

<x:String x:Key="dateFormat">{0:dd-M-yyyy HH:mm:ss}</x:String>

使用它:

Text="{Binding Description.CreationDateTime,Converter={StaticResource StringFormatConverter}, ConverterParameter={StaticResource dateFormat}}"

问题三

似乎是xamarin错误。您可以按照我在第一期中描述的那样创建转换器,但是它应该可以立即使用。