【问题标题】:Xamarin.Forms ListView disable selection on UWPXamarin.Forms ListView 禁用 UWP 上的选择
【发布时间】:2017-07-15 06:45:00
【问题描述】:

当使用 Xamarin.Forms ListView 时,是否有任何方法可以删除 ListView 自动滚动到 UWP 上的选定单元格,同时仍然允许在单元格布局中选择元素?另外,有什么办法可以去掉相同情况下单元格上的“选中”动画?

我已经设法通过在 ListViewRenderer 中完全禁用命中检测来实现视觉效果,如下所示:

var style = new Style(typeof(ListViewItem));
var setter = new Setter(ListViewItem.IsHitTestVisibleProperty, false);
style.Setters.Add(setter);
((ListView)Control).ItemContainerStyle = style;

但是很明显,这也会禁用单元格内元素的命中检测。

UWP 中是否有任何方法可以实现禁用动画/ListView 自动滚动,同时仍允许检测单元格内的按钮等?

【问题讨论】:

    标签: listview xamarin uwp xamarin.forms


    【解决方案1】:

    在 UWP 上,ListViews 有一个 SelectionMode 属性,可以设置为 None。这可能是禁用自动滚动的最简单方法。不幸的是,此属性未反映在 ListView 的 Xamarin.Forms 抽象中。

    要设置它(仅在 UWP 上),您实际上并不需要自定义渲染器,Xamarin.Forms Effect 应该可以完成这项工作。因此,您可以在 Xamarin.Forms UWP 项目中简单地创建一个 NoSelectionEffect 类并让它看起来像这样:

    using ListViewScrollingTestForms.UWP;
    using Xamarin.Forms;
    using Xamarin.Forms.Platform.UWP;
    
    [assembly: ResolutionGroupName("MyCompany")]
    [assembly: ExportEffect(typeof(NoSelectionEffect), "NoSelectionEffect")]
    namespace ListViewScrollingTestForms.UWP
    {
        public class NoSelectionEffect : PlatformEffect
        {
            protected override void OnAttached()
            {
                // Set selection mode to 'None'     
                (Control as Windows.UI.Xaml.Controls.ListView).SelectionMode = Windows.UI.Xaml.Controls.ListViewSelectionMode.None;            
            }
    
            protected override void OnDetached()
            {
                // Set selection mode back to the default one of Xamarin.Forms (Single)
                (Control as Windows.UI.Xaml.Controls.ListView).SelectionMode = Windows.UI.Xaml.Controls.ListViewSelectionMode.Single;
            }
        }
    }
    

    接下来,您需要在 Xamarin.Forms PCL 中为渲染器创建一个类:

    public class NoSelectionEffect : RoutingEffect
    {
        public NoSelectionEffect() : base("MyCompany.NoSelectionEffect") {}
    }
    

    现在您可以将效果附加到您的ListView,它应该可以完成这项工作。

    <ListView>
        <ListView.Effects>
            <local:NoSelectionEffect />
        </ListView.Effects>
    </ListView>
    

    如果有帮助,请告诉我!

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多