Xamarin формы: пользовательский рендер Frame Shadow - PullRequest
0 голосов
/ 23 октября 2018

У меня есть пользовательское средство визуализации, чтобы иметь возможность изменять свойства слоя, который монтирует тень, однако этот кадр после отображения на экране, когда мне нужно изменить его размер, не "берет" тень вместе.Тень остается там, где я был раньше, я использую пользовательский рендерер, потому что нативная тень очень «сильная», и я не нашел способа ее изменить.

Любые предложения о том, чего не хватает, чтобы это было нормально?Я уже пытался перенести его в измененное свойство фрейма и снова выполнить рисование, но оно не было решено.

Пользовательский рендер:

public override void Draw(CGRect rect)
        {
            base.Draw(rect);
            Layer.ShadowRadius = 3;
            Layer.ShouldRasterize = true;
            Layer.ShadowColor = UIColor.Gray.CGColor;
            Layer.ShadowOffset = new CGSize(0, 1);
            Layer.ShadowOpacity = 0.25f;
            Layer.ShadowPath = UIBezierPath.FromRoundedRect(Layer.Bounds, Element.CornerRadius).CGPath;
            Layer.MasksToBounds = false;
        }

Cardfarme xaml:

<?xml version="1.0" encoding="utf-8" ?>
<customControls:CardFrame
    x:Class="dragon.Views.UserControls.CardListUserControl"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:b="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"
    xmlns:customControls="clr-namespace:dragon.CustomControls;assembly=dragon"
    HasShadow="True"
    MinimumHeightRequest="160">

    <Frame
        x:Name="ColoredFrame"
        CornerRadius="3"
        HasShadow="False">
        <Frame Style="{StaticResource CardWhiteFrame}">
            <StackLayout
                x:Name="Teste"
                HorizontalOptions="Fill"
                Spacing="10"
                Style="{StaticResource CardContentStacklayoutStyle}">
                <StackLayout HorizontalOptions="Fill" Orientation="Horizontal">
                    <Label
                        x:Name="HeaderLabel"
                        Style="{StaticResource CardHeaderTextStyle}"
                        Text="{Binding HeaderText}" />
                    <Image
                        x:Name="ImgAbout"
                        Margin="0,5,0,15"
                        HorizontalOptions="EndAndExpand"
                        Source="about1.png" />
                </StackLayout>

                <ListView
                    x:Name="CardItemsList"
                    ItemsSource="{Binding ItemsList}"
                    SeparatorColor="LightGray"
                    VerticalOptions="StartAndExpand">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Grid Margin="5,0,10,0">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="Auto" />
                                    </Grid.ColumnDefinitions>
                                    <Label
                                        Grid.Column="0"
                                        HorizontalOptions="Start"
                                        LineBreakMode="TailTruncation"
                                        Text="{Binding .}"
                                        TextColor="#333333"
                                        VerticalOptions="Center" />
                                    <Grid
                                        Grid.Column="1"
                                        HorizontalOptions="FillAndExpand"
                                        VerticalOptions="FillAndExpand">
                                        <Grid.GestureRecognizers>
                                            <TapGestureRecognizer Command="{Binding Path=BindingContext.RemoveCommand, Source={x:Reference CardItemsList}}" CommandParameter="{Binding .}" />
                                        </Grid.GestureRecognizers>
                                        <BoxView
                                            x:Name="RemoveBoxView"
                                            Grid.Column="1"
                                            CornerRadius="2"
                                            HeightRequest="3"
                                            HorizontalOptions="Center"
                                            VerticalOptions="Center"
                                            WidthRequest="30"
                                            Color="{StaticResource DefaultRedColor}" />
                                    </Grid>
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
                <Entry
                    x:Name="EntryOfNewItemToInsert"
                    IsVisible="False"
                    Placeholder="Inserir novo item"
                    Text="{Binding NewItemToAdd}"
                    Unfocused="EntryOfNewItemToInsert_Unfocused">
                    <Entry.Behaviors>
                        <b:EventToCommandBehavior Command="{Binding InserNewItemCommand}" EventName="Unfocused" />
                    </Entry.Behaviors>
                </Entry>
                <Button
                    x:Name="Button"
                    Clicked="Button_Clicked"
                    Style="{StaticResource DefaultOrangeButtonStyle}"
                    Text="{Binding ButtonText}" />
            </StackLayout>
        </Frame>
    </Frame>
</customControls:CardFrame>

Печать: enter image description here

На изображении у нас есть первая карта с элементами внутри списка, которая расширяет ее, а на другой карте - без изменений в списке(не нужно расширять) правильно, как следует, помня, что если нативная тень работает, и Android тоже работает, потому что к нему не применен пользовательский рендерер.

1 Ответ

0 голосов
/ 23 октября 2018

Переопределить OnElementPropertyChanged следующим образом:

protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
     var rect = new CGRect(0, 0, 0, 0);
     SetNeedsDisplay();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...