第一个问题:
我从以下位置更改了旧代码(以支持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>
如何解决它们?
答案 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错误。您可以按照我在第一期中描述的那样创建转换器,但是它应该可以立即使用。