Xamarin iOS Custom ListView

我在 .我希望 所包含的物品只占用尽可能多的空间。但是,我几乎总是占用所有空间,即使它只包含3个左右的项目。ListViewStackedLayoutListViewListView


有没有办法创建自定义并覆盖某些方法,以便在添加或删除项目时计算自定义大小?例如,我希望列表在为空时消失。任何人都可以告诉我,要重写哪些方法和/或如何对添加到/删除到基础模型的项目做出反应?DynamicListView


我的直觉告诉我这样的事情:


namespace Foo.Controls

{

    public class SpottedView : ListView

    {

        public SpottedView()

        {

        }


        protected override void OnChildAdded(Element child)

        {

            Console.WriteLine($"{Util.methodName()}");

            base.OnChildAdded(child);

            InvalidateMeasure();

        }


        protected override void OnChildRemoved(Element child)

        {

            Console.WriteLine($"{Util.methodName()}");

            base.OnChildRemoved(child);

            InvalidateMeasure();

        }

    }

}


莫回无
浏览 105回答 1
1回答

慕莱坞森

我找到了解决这个问题的方法。我从 更改为 以下内容:StackLayoutGrid<ContentPage.Content>&nbsp; &nbsp; <Grid>&nbsp; &nbsp; &nbsp; &nbsp; <Grid.RowDefinitions>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <RowDefinition Height="*"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <RowDefinition Height="Auto" />&nbsp; &nbsp; &nbsp; &nbsp; </Grid.RowDefinitions>&nbsp; &nbsp; &nbsp; &nbsp; <ctrl:CameraView Grid.Row="0" />&nbsp; &nbsp; &nbsp; &nbsp; <ctrl:SpottedView Grid.Row="1" RowHeight="40" />&nbsp; &nbsp; </Grid></ContentPage.Content>然后我添加了一个 自定义 ,如下所示:ListViewSpottedViewnamespace Foo.Controls{&nbsp; &nbsp; public class SpottedView : ListView&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ObservableCollection<string> items;&nbsp; &nbsp; &nbsp; &nbsp; public SpottedView() : base()&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items = new ObservableCollection<string>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ItemsSource = items;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items.CollectionChanged += onItemsChanged;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TODO: test purposes, remove later&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var autoEvent = new AutoResetEvent(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var stateTimer = new Timer(onTimer, autoEvent, 1000, 2000);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; void onItemsChanged(object sender, NotifyCollectionChangedEventArgs e)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MainThread.BeginInvokeOnMainThread(() =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HeightRequest = RowHeight * items.Count;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; InvalidateMeasure();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // TODO test purposes, remove later.&nbsp; &nbsp; &nbsp; &nbsp; void onTimer(object state)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MainThread.BeginInvokeOnMainThread(() =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (items.Count < 2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items.Add("Blah");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; items.Clear();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}像吊饰一样工作。
打开App,查看更多内容
随时随地看视频慕课网APP