the view is invisible when Drop

70 Views Asked by At

I Create A Custom View named ScrollView The ability of this view is just like its name

this view of children include only Label, And support scroll and click,even drop

In actual use,scrolling and clicking works well,dropping was too but the Label will invisible when drop this label still occupy the layout,just invisible

the drop func will still execute when i drop once again in that invisible label

I execute apps on Android

ScrollPicker of XAML:

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DebugTest.MyView.ApplyView.ScrollPicker">
  <ContentView.Content>
        <ScrollView x:Name="ScrollView" x:FieldModifier="Public">
            <StackLayout x:Name="MainView" x:FieldModifier="Public">
                
            </StackLayout>
        </ScrollView>
  </ContentView.Content>
</ContentView>

And C# Code

public partial class ScrollPicker : ContentView
    {
        public static readonly BindableProperty OrientationProperty = BindableProperty.Create("Orientation", typeof(StackOrientation), typeof(ScrollPicker), StackOrientation.Vertical, propertyChanged: Orientation_Changed);
        public static readonly BindableProperty ItemSourceProperty = BindableProperty.Create("ItemSource", typeof(List<string>), typeof(ScrollPicker), propertyChanged: ItemSource_Changed);
        private static void Orientation_Changed(BindableObject bindable, object oldValue, object newValue)
        {
            if(((StackOrientation)newValue) == StackOrientation.Horizontal)
            {
                ((ScrollPicker)bindable).ScrollView.Orientation = ScrollOrientation.Horizontal;
                ((ScrollPicker)bindable).MainView.Orientation = StackOrientation.Horizontal;
            }
            else
            {
                ((ScrollPicker)bindable).ScrollView.Orientation = ScrollOrientation.Vertical;
                ((ScrollPicker)bindable).MainView.Orientation = StackOrientation.Vertical;
            }
        }
        private static void ItemSource_Changed(BindableObject bindable, object oldValue, object newValue)
        {
            var view = ((ScrollPicker)bindable);
            view.ItemSourceList = (List<string>)newValue;
            view.ResetLabelList();
        }
        public StackOrientation Orientation
        {
            get { return (StackOrientation)GetValue(ItemSourceProperty); }
            set { SetValue(ItemSourceProperty, value); }
        }
        public List<string> ItemSource
        {
            get { return (List<string>)GetValue(ItemSourceProperty); }
            set { SetValue(ItemSourceProperty, value); }
        }
        public DropGestureRecognizer DropGR;
        public event EventHandler<IndexArgs> ItemClickEvent;
        public event EventHandler<IndexArgs> DropEvent;
        public List<string> ItemSourceList;
        public List<Label> LabelList = new List<Label>();
        public ScrollPicker()
        {
            InitializeComponent();
            ItemClickEvent += ScrollPicker_ItemClickEvent;
            DropEvent += ScrollPicker_DropEvent;
        }

        private void ScrollPicker_DropEvent(object sender, EventArgs e)
        {
            
        }

        private void CE_Click(Element obj)
        {
            if(LabelList != null && LabelList.Count != 0)
            {
                if(LabelList.Exists(label => label == obj))
                {
                    int index = LabelList.IndexOf((Label)obj);
                    ItemClickEvent.Invoke(obj, new IndexArgs(index));
                }
            }
        }
        private void ScrollPicker_ItemClickEvent(object sender, EventArgs e)
        {
            
        }
        private void ResetLabelList()
        {
            MainView.Children.Clear();
            LabelList.Clear();
            if (ItemSourceList != null && ItemSourceList.Count != 0)
            {
                for(int i=0;i< ItemSourceList.Count;i++)
                {
                    //创建Label
                    Label temp = CreateSubView(ItemSourceList[i]);
                    //绑定CE
                    ClickEffect CE = new ClickEffect();
                    CE.Click += CE_Click;
                    Global.ClickEffect_BindClickEffect(temp, CE);
                    //添加Drop
                    DropGR = new DropGestureRecognizer();
                    DropGR.DragOver += DropGR_DragOver;
                    DropGR.DragLeave += DropGR_DragLeave;
                    DropGR.Drop += DropGR_Drop;
                    temp.GestureRecognizers.Add(DropGR);
                    //添加视图
                    LabelList.Add(temp);
                    MainView.Children.Add(temp);

                    if (i == 0) temp.Opacity = 0.1;
                }
            }
        }
        private void DropGR_DragOver(object sender, DragEventArgs e)
        {

        }
        private void DropGR_DragLeave(object sender, DragEventArgs e)
        {
            
        }
        private void DropGR_Drop(object sender, DropEventArgs e)
        {
            var view = (sender as GestureRecognizer).Parent as View;
            int index = MainView.Children.IndexOf(view);
            DropEvent.Invoke(view, new IndexArgs(index));
        }

        private Label CreateSubView(string text)
        {
            Label label = new Label()
            {
                Text = text,
                FontSize = 20,
                WidthRequest = 75,
                VerticalTextAlignment = TextAlignment.Start,
                HorizontalTextAlignment = TextAlignment.Start,
            };
            return label;
        }
    }
    public abstract partial class ScrollPickerItemView : ContentView
    {

    }
    public class IndexArgs: EventArgs
    {
        public int Index;
        public IndexArgs(int index =0)
        {
            Index = index;
        }
    }
    public enum ScrollPickerOrientation
    {
        Vertical,
        Horizontal
    }

How Use In Page:

......
<AbsoluteLayout AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,0.1" BackgroundColor="#66CCFF">
                <Label AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,0.2,1" 
                       Text="Project:" FontSize="Large" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                <applyview:ScrollPicker x:Name="ProjectPicker" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="1,0,0.8,1" Orientation="Horizontal" 
                                        ItemClickEvent="ProjectPicker_ItemClickEvent" DropEvent="ProjectPicker_DropEvent"/>
            </AbsoluteLayout>

I don't know how to solve this problem. Can someone help me?

1

There are 1 best solutions below

2
xxpp123zz On

I'm afraid I've found the problem

I added a PropertyChanged callback function to each label. I was surprised to find that when I triggered the drop function, the text of the label changed and became Empty

That's why he disappeared!!!

I'm very sorry, but it's a shame

Although the problem has been solved, I still don't know why the text of label becomes null when I trigger the drop function