【问题标题】:Listview item horizontal in xamarin formxamarin形式的Listview项目水平
【发布时间】:2017-10-06 19:41:13
【问题描述】:

我想在我的应用程序中水平列出项目。 我在展示 xamarin 中看到 Printerest App,它具有相同的情况。

我使用CarouselView,但它显示全屏。

请给我一个解决方案。 谢谢。

【问题讨论】:

标签: xamarin xamarin.forms


【解决方案1】:

您可以使用 ScrollView 和 StackLayout 创建自己的水平列表。

类似这样的:

public class HorizontalList : Grid
{
    private ICommand innerSelectedCommand;
    private ScrollView scrollview;
    private StackLayout mainPanel;
    public event EventHandler SelectedItemChanged;
    public static readonly BindableProperty SelectedCommandProperty =
        BindableProperty.Create("SelectedCommand", typeof(ICommand), typeof(HorizontalList), null);

    public static readonly BindableProperty ItemsSourceProperty =
        BindableProperty.Create("ItemsSource", typeof(IEnumerable), typeof(HorizontalList), default(IEnumerable<object>), BindingMode.TwoWay, propertyChanged: ItemsSourceChanged);

    public static readonly BindableProperty SelectedItemProperty =
        BindableProperty.Create("SelectedItem", typeof(object), typeof(HorizontalList), null, BindingMode.TwoWay, propertyChanged: OnSelectedItemChanged);

    public static readonly BindableProperty ItemTemplateProperty =
        BindableProperty.Create("ItemTemplate", typeof(DataTemplate), typeof(HorizontalList), default(DataTemplate));

    public ICommand SelectedCommand
    {
        get { return (ICommand)GetValue(SelectedCommandProperty); }
        set { SetValue(SelectedCommandProperty, value); }
    }

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public object SelectedItem
    {
        get { return (object)GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }

    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    private static void ItemsSourceChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var itemsLayout = (HorizontalList)bindable;
        itemsLayout.SetItems();
    }

    public HorizontalList()
    {
        scrollview = new ScrollView();
        mainPanel = new StackLayout
        {
            Orientation = StackOrientation.Horizontal;
            HorizontalOptions = LayoutOptions.FillAndExpand
        };
        scrollview.Content = mainPanel;
        scrollview.Orientation = ScrollOrientation.Horizontal
        Children.Add(scrollview);
    }

    protected virtual void SetItems()
    {
        mainPanel.Children.Clear();

        if (ItemsSource == null)
        {
            return;
        }

        innerSelectedCommand = new Command<View>(view =>
        {
            SelectedItem = view.BindingContext;
            SelectedItem = null; // Allowing item second time selection
        });

        foreach (var item in ItemsSource)
        {
            mainPanel.Children.Add(GetItemView(item));
        }

        SelectedItem = null;
    }

    protected virtual View GetItemView(object item)
    {
        var content = ItemTemplate.CreateContent();
        var view = content as View;

        if (view == null)
        {
            return null;
        }

        view.BindingContext = item;

        var gesture = new TapGestureRecognizer
        {
            Command = innerSelectedCommand,
            CommandParameter = view
        };

        AddGesture(view, gesture);

        return view;
    }

    private void AddGesture(View view, TapGestureRecognizer gesture)
    {
        view.GestureRecognizers.Add(gesture);

        var layout = view as Layout<View>;

        if (layout == null)
        {
            return;
        }

        foreach (var child in layout.Children)
        {
            AddGesture(child, gesture);
        }
    }

    private static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var itemsView = (HorizontalList)bindable;
        if (newValue == oldValue && newValue != null)
        {
            return;
        }

        itemsView.SelectedItemChanged?.Invoke(itemsView, EventArgs.Empty);

        if (itemsView.SelectedCommand?.CanExecute(newValue) ?? false)
        {
            itemsView.SelectedCommand?.Execute(newValue);
        }
    }
}

Here 是类似方法的示例。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @khillang,感谢您的指出。我添加了代码以便更好地理解。但我想,我提到了解决问题的方法。
【解决方案2】:

您可以使用 ListView 并将 Rotation 设置为 270 度。

This 就是一个例子。

请注意,您可能需要根据需要更改高度和宽度,并且

This 可能对你有用。

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 2015-12-29
    • 2010-11-05
    • 2012-07-05
    • 2019-06-20
    • 2010-09-26
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多