【问题标题】:Expanding the size of ListView cell on tap点击时扩大 ListView 单元格的大小
【发布时间】:2018-06-25 06:11:25
【问题描述】:

我正在尝试实施一种解决方案,以在使用Xamarin Forms(以及如果需要的自定义渲染器)点击时增加ListView Cell 的大小。

我对 C# 还是很陌生,数据绑定的想法对我来说还有点不清楚,但是,这似乎是解决这个问题的方法(也许类似于绑定Height / HeightRequest 单元格的属性?)。

到目前为止,我的尝试都没有成功。

如果有人能推动我朝着正确的方向前进,我将不胜感激。

谢谢!

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    ViewCell Xamarin.Forms 1.4.2x中将Height暴露为BindableProperty

    但是,如果您在Model 中创建自己的BindableProperty,您仍然可以实现更改高度,如下所示:-

    型号:-

    public class MenuItem2 : BindableObject
    {
    
        public static readonly BindableProperty TextProperty = BindableProperty.Create<MenuItem2, string>(p => p.Text, default(string));
        public static readonly BindableProperty CellHeightProperty = BindableProperty.Create<MenuItem2, int>(p => p.CellHeight, default(int));
    
    
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
    
        public int CellHeight
        {
            get { return (int)GetValue(CellHeightProperty); }
            set { SetValue(CellHeightProperty, value); }
        }
    }
    

    XAML:-

    <StackLayout>
    
        <Button x:Name="cmdButton1" Text="Change Cell Heights" Clicked="cmdButton1_Clicked"/>
    
        <ListView x:Name="lstItems" />
    
    </StackLayout>
    

    XAML 代码隐藏:-

        lstItems.HasUnevenRows = true;
        lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell2));
        //
        lstItems.ItemsSource = new List<MenuItem2> 
        {
            new MenuItem2(),
            new MenuItem2(),
            new MenuItem2(),
            new MenuItem2(),
        };
    

    如果您不设置.HasUnevenRows,您将无法更改单元格高度。

        void cmdButton1_Clicked(object sender, EventArgs e)
        {
            Random objRandom = new Random();            
            //
            var objItems = lstItems.ItemsSource;
            //
            foreach (MenuItem2 objMenuItem in objItems)
            {
                int intNewCellHeight = objRandom.Next(80, 160);
                objMenuItem.CellHeight = intNewCellHeight;
                objMenuItem.Text = "Cell Height = " + intNewCellHeight.ToString();
            }
        }
    

    自定义 ViewCell:-

    public class MenuCell2 : ViewCell
    {
        public MenuCell2()
        {
            Label objLabel = new Label
            {
                YAlign = TextAlignment.Center,
                TextColor = Color.Yellow,                
            };
            objLabel.SetBinding(Label.TextProperty, new Binding("Text"));
    
    
            StackLayout objLayout = new StackLayout
            {
                Padding = new Thickness(20, 0, 0, 0),
                Orientation = StackOrientation.Horizontal,
                HorizontalOptions = LayoutOptions.StartAndExpand,
                Children = { objLabel }
            };
    
            Frame objFrame_Inner = new Frame
            {
                Padding = new Thickness(15, 15, 15, 15),
                HeightRequest = 36,
                OutlineColor = Color.Accent,
                BackgroundColor = Color.Blue,
                Content = objLayout,                
            };
    
            Frame objFrame_Outer = new Frame
            {
                Padding = new Thickness(0, 0, 0, 10),
                Content = objFrame_Inner
            };
    
            View = objFrame_Outer;            
    
            this.BindingContextChanged += MenuCell2_BindingContextChanged;
        }
    
        void MenuCell2_BindingContextChanged(object sender, EventArgs e)
        {
            MenuItem2 objMenuItem = (MenuItem2)this.BindingContext;
            objMenuItem.PropertyChanged += objMenuItem_PropertyChanged;
        }
    
        void objMenuItem_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            switch (e.PropertyName)
            {
                case "CellHeight":
                    this.Height = (this.BindingContext as MenuItem2).CellHeight;
                    (this.View as Frame).ForceLayout();
                    break;
            }
        }
    

    记得在ViewCellView属性的根元素上调用ForceLayout,这样才能正确重绘。

    这将为您提供类似于以下的结果(目前仅在 WindowsPhone 上测试):-

    为了在ViewCell 被点击时执行此操作,请在 XAML 页面上添加:-

        lstItems.ItemTapped += lstItems_ItemTapped;
    

    然后将项目的model 更改为如下内容:-

        void lstItems_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            (e.Item as MenuItem2).CellHeight = 200;
        }
    

    【讨论】:

    • 谢谢,你的回答真的很有帮助
    【解决方案2】:
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2013-08-21
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多