Xamarin 在点击时扩展ListView单元格的大小

Xamarin 在点击时扩展ListView单元格的大小,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在尝试实现一个解决方案,当使用Xamarin表单点击时,增加列表视图单元格的大小(以及自定义渲染器,如果需要) 我对C#还是相当陌生,数据绑定的概念对我来说还是有点不清楚,但是,似乎这就是解决这个问题的方法(可能是绑定单元格的高度/高度请求属性?) 到目前为止,我的尝试没有成功 如果有人能把我推向正确的方向,我将不胜感激 谢谢大家! ViewCell在Xamarin.Forms 1.4.2x 但是,如果您在模型中创建自己的BindableProperty,您仍然可以实现如下所示的高度更改:-

我正在尝试实现一个解决方案,当使用
Xamarin表单
点击时,增加
列表视图
单元格
的大小(以及自定义渲染器,如果需要)

我对C#还是相当陌生,数据绑定的概念对我来说还是有点不清楚,但是,似乎这就是解决这个问题的方法(可能是绑定单元格的
高度
/
高度请求
属性?)

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

如果有人能把我推向正确的方向,我将不胜感激


谢谢大家!

ViewCell
Xamarin.Forms 1.4.2x

但是,如果您在
模型中创建自己的
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); }
    }
}
<StackLayout>

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

    <ListView x:Name="lstItems" />

</StackLayout>
    lstItems.HasUnevenRows = true;
    lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell2));
    //
    lstItems.ItemsSource = new List<MenuItem2> 
    {
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
    };
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;
        }
    }
自定义视图单元格:-

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); }
    }
}
<StackLayout>

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

    <ListView x:Name="lstItems" />

</StackLayout>
    lstItems.HasUnevenRows = true;
    lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell2));
    //
    lstItems.ItemsSource = new List<MenuItem2> 
    {
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
    };
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;
        }
    }
记住在
ViewCell
View
属性的根元素上调用
ForceLayout
,以便它可以正确地重新绘制

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

要在点击的
ViewCell
上执行此操作,请在XAML页面上添加:-

    lstItems.ItemTapped += lstItems_ItemTapped;
然后将该项目的
模型更改为如下内容:-

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

ViewCell
Xamarin.Forms 1.4.2x

但是,如果您在
模型中创建自己的
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); }
    }
}
<StackLayout>

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

    <ListView x:Name="lstItems" />

</StackLayout>
    lstItems.HasUnevenRows = true;
    lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell2));
    //
    lstItems.ItemsSource = new List<MenuItem2> 
    {
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
    };
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;
        }
    }
自定义视图单元格:-

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); }
    }
}
<StackLayout>

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

    <ListView x:Name="lstItems" />

</StackLayout>
    lstItems.HasUnevenRows = true;
    lstItems.ItemTemplate = new DataTemplate(typeof(Classes.MenuCell2));
    //
    lstItems.ItemsSource = new List<MenuItem2> 
    {
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
        new MenuItem2(),
    };
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;
        }
    }
记住在
ViewCell
View
属性的根元素上调用
ForceLayout
,以便它可以正确地重新绘制

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

要在点击的
ViewCell
上执行此操作,请在XAML页面上添加:-

    lstItems.ItemTapped += lstItems_ItemTapped;
然后将该项目的
模型更改为如下内容:-

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

Xamarin现在有一个在xaml和xaml代码隐藏中正确执行此操作的官方示例:

概述:

代码:

Xamarin现在有一个官方示例,可以在xaml和xaml代码隐藏中正确执行此操作:

概述:

代码:

谢谢,你的回答真的很有帮助谢谢,你的回答真的很有帮助