Я сталкиваюсь с проблемой, когда, если я даю свой фрейм, который находится внутри шаблона элемента ListView, при удалении объекта я получаю исключение FrameRenderer, в частности Unable to activate instance of type Xamarin.Forms.Platform.Android.FrameRenderer
. Однако на iOS это не проблема. Если я установлю значение stati c для радиуса угла, ошибка исчезнет.
Причина, по которой мне нужно, чтобы модель вида управляла радиусом рамки, заключается в том, что мы пытаемся создать круги, и мы заметили, что для достижения круга android должен иметь угол радиус в два раза больше его ширины и радиуса. ТАК если W = R = 20, то угловой радиус равен 40. Для iOS это обратное значение, угловой радиус равен половине.
XAML, где он связан:
<ListView SelectedItem="{Binding SelectedUser, Mode=TwoWay}" ItemsSource="{Binding Users}" HasUnevenRows="True" SeparatorVisibility="None">
<ListView.ItemTemplate>
<DataTemplate>
<customcontrols:NoHighlightCell>
<StackLayout effects:RoundCornersEffect.CornerRadius="8" Orientation="Horizontal" HorizontalOptions="FillAndExpand" VerticalOptions="Start" Spacing="0" Margin="0, 5, 0, 5">
<BoxView HeightRequest="1" WidthRequest="5" VerticalOptions="FillAndExpand" HorizontalOptions="Start" BackgroundColor="{Binding SelectedColor}"></BoxView>
<StackLayout Opacity="{Binding Opacity}" Padding="5, 5, 0, 5" VerticalOptions="StartAndExpand" HorizontalOptions="FillAndExpand" Orientation="Horizontal" BackgroundColor="{Binding CellBackgroundColor}">
<Frame Padding="0" WidthRequest="40" HeightRequest="40" CornerRadius="{Binding CornerRadiusForPhone}" BackgroundColor="{Binding InitialCircleColor}" VerticalOptions="Start" HorizontalOptions="Start" HasShadow="False">
<Label Padding="0" Text="{Binding UserInitials}" TextColor="{Binding LetterColoring}" FontAttributes="Bold" FontSize="14" HorizontalOptions="Center" HorizontalTextAlignment="Start" VerticalTextAlignment="Center"></Label>
</Frame>
<StackLayout Spacing="0" Orientation="Horizontal" Padding="20, 0, 0, 0" HorizontalOptions="FillAndExpand">
<StackLayout Orientation="Vertical" HorizontalOptions="Fill" VerticalOptions="Fill">
<Label FontAttributes="Bold" Text="{Binding FullName}" VerticalOptions="EndAndExpand"/>
<Label Text="{Binding Location}" VerticalOptions="EndAndExpand"></Label>
</StackLayout>
<customcontrols:UnderlineLabel TextDecorations="Underline" Padding="0, 0, 14, 0" Text="Remove" TextColor="#BB3734" FontSize="13" HorizontalOptions="EndAndExpand" HorizontalTextAlignment="Start" VerticalTextAlignment="Center" IsVisible="{Binding ManagingUsers}">
<customcontrols:UnderlineLabel.GestureRecognizers>
<TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding Path=BindingContext.RemoveUserCommand, Source={x:Reference root}}" CommandParameter="{Binding .}"></TapGestureRecognizer>
</customcontrols:UnderlineLabel.GestureRecognizers>
</customcontrols:UnderlineLabel>
</StackLayout>
</StackLayout>
</StackLayout>
</customcontrols:NoHighlightCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Код CornerRadiusForPhone
в модели представления:
public float CornerRadiusForPhone {
get {
if(Device.RuntimePlatform == Device.Android)
{
return 80f;
} else
{
return 20f;
}
}
}
Часть кода, вызывающая кр sh находится в модели представления, связанной с XAML, которая просто удаляет выбранный элемент из коллекции Users
ObservableCollection, которая является ItemSource Списка.
private void RemoveUser(object obj)
{
try
{
var toRemove = (RegisteredUsersViewModel) obj;
tokenService.Logout(toRemove.UserId);
Users.Remove(toRemove);
} catch (Exception e)
{
Console.Write(e);
}
}
Обычно я предпочел бы использовать OnPlatform внутри xaml, но если я не ошибаюсь, так как CornerRadius - это float и нет аргумента типа float, я не могу использовать этот трюк.