【问题标题】:Can I change the background color in ListView cells without losing haptic (touch) feedback?我可以在不丢失触觉(触摸)反馈的情况下更改 ListView 单元格中的背景颜色吗?
【发布时间】:2016-12-29 05:55:00
【问题描述】:

(我在Xamarin forums 上询问但没有得到回复,所以我在这里尝试)

在 Xamarin 表单中,在 ListView 中设置 BackgroundColor ItemTemplate causes haptic-feedback to be disabled

有什么办法可以解决这个问题吗?我想自定义列表项的颜色,但没有触觉反馈看起来像垃圾。

XAML 示例:

 <ListView x:Name="list"
           ItemTapped="OnItemSelected"
           IsGroupingEnabled="True"
           GroupDisplayBinding="{Binding Key}"
           GroupShortNameBinding="{Binding Key}"
           HasUnevenRows="True"
           ItemsSource="{Binding .}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
              <StackLayout VerticalOptions="FillAndExpand"
                           Padding="5, 20"
                           BackgroundColor="#CCCCCC"> <!--This line causes haptic feedback to fail -->
                <Label Text="{Binding Name}"
                       TextColor="Black"
                       VerticalOptions="Center"
                       FontSize="Large"/>
              </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我得到的最接近的方法是将BackgroundColor 更改为ViewCell.Tapped,然后将其更改回View.OnAppearing() ViewCell.Appearing 已损坏),但是当手指是抬起的,而不是按下时。

我正在 Android 上进行测试,但更喜欢跨平台解决方案。

【问题讨论】:

    标签: listview xamarin xamarin.forms


    【解决方案1】:

    查看您在 Xamarin 论坛上的帖子以获取我的反馈。我有一个简单的解决方案,叫做 XFGloss。它是 Xamarin.Forms 的免费开源插件。来源可在GitHub 获得。还有一个NuGet package 可用。它允许您将 BackgroundColor 值分配给标准 XF 单元控件(TextCell、EntryCell 等)。 XFGloss 还添加了其他几个新属性。

    如果您希望修复现有实现,可以查看我为支持此code commit 中的视觉反馈所做的更改。

    【讨论】:

    • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
    • 抱歉,罗伯特。我通过链接到代码提交来编辑我的回复以包含答案,在该代码提交中我修复了他所询问的实现中的相同问题。
    • 我还没有机会尝试,但我暂时将其标记为已接受。恭喜获得赏金,欢迎来到 stackoverflow!
    • 只是一个更新:它的工作原理与宣传的完全一样!非常感谢你,汤米!
    • 太棒了,这是个好消息!谢谢你告诉我。
    【解决方案2】:

    设置背景颜色后,除非您在每个平台上创建自定义渲染,否则您将看不到所选项目颜色或触觉反馈。

    以下是您可以使用 Bindings 设置所选项目颜色的跨平台和基于 MVVM 的解决方法:

    1. 将属性绑定到SelectedItemListView
    2. StackLayout 的背景颜色绑定到一个自动属性,并设置“#CCCCCC”的值,如果它没有被选中,则设置其他颜色。
    3. 您需要订阅MyItem 类中的SelectedMyItem 属性并调用BackgroundColor 属性的OnPropertyChanged。为此,您可以发起一个事件并订阅或任何您觉得舒服的事情。(这在下面提供的示例伪代码中没有实现)

    视图模型:

    public class MyViewModel : IMyViewModel
    {
        public ObserveableCollection<MyItem> Items { get; set; }
        public MyItem SelectedMyItem { get; set; }
    }
    

    列表项类:

    public class MyItem 
    {
        private readonly IMyViewModel _myViewModel;
    
        public MyItem(IMyViewModel myViewModel)
        {
            _myViewModel = myViewModel;
        }
    
        public string Name { get; set; }
        public Color BackgroundColor => _myViewModel.SelectedMyItem == this 
                                        ? Color.Red : Color.FromHex("CCCCCC");        
    }
    

    XAML:

    <ListView x:Name="list"
               IsGroupingEnabled="True"
               GroupDisplayBinding="{Binding Key}"
               GroupShortNameBinding="{Binding Key}"
               HasUnevenRows="True"
               ItemsSource="{Binding Items}"
               SelectedItem="{Binding SelectedMyItem}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                  <StackLayout VerticalOptions="FillAndExpand"
                               Padding="5, 20"
                               BackgroundColor="{Binding BackgroundColor}">
                       <StackLayout.GestureRecognizers>
                           <TapGestureRecognizer Tapped="OnItemTapped" />
                       </StackLayout.GestureRecognizers>
                    <Label Text="{Binding Name}"
                           TextColor="Black"
                           VerticalOptions="Center"
                           FontSize="Large"/>
                  </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    

    触觉反馈解决方法:

    通常一次触摸是 200-300 毫秒。轻按一个项目后,您可以在这么长的时间内更改背景颜色,然后设置为原始颜色。

    public async void OnItemTapped(object sender, EventArgs args) 
    {
       BackgroundColor = Color.Orange; //touch color
       await Task.Delay(250);          //time to show new color
       BackgroundColor = Color.Red;    //original color
    }
    

    您甚至可以通过尝试合并animations 来进一步改进这一点,也许是FadeTo 用于更改颜色。

    【讨论】:

    • 这会改变所选项目的背景,这与触觉反馈不同。即使您在短时间内设置背景颜色(就像问题中更简单的建议),它仍然会在手指抬起而不是按下后改变背景,这感觉不对.
    • 我也为触觉反馈添加了一个解决方法。如果您需要完美的实现,创建自定义渲染总是更好。您可以从 github 查看现有的实现并对其进行扩展。
    • 那个解决方法正是我在问题和我上面的评论中提到的......
    • 那么你的问题的答案是否定的,除非你准备好通过自定义渲染器来做。
    【解决方案3】:

    您可以在 Viewcell 继承的类中简单地使用它

    this.Tapped += ViewCell_Tapped; // 通过在您的视单元中使用轻敲,您可以实现类似触觉。

    private async void ViewCell_Tapped(object sender, 事件参数 e) { this.View.BackgroundColor = 颜色.灰色; 等待 Task.Delay(10);
    this.View.BackgroundColor = 颜色.白色; }

    这对我有用。

    【讨论】:

    • 在问题中,它已经说 “我得到的最接近的是更改 ViewCell.Tapped 中的 BackgroundColor,然后在 View.OnAppearing() 中将其更改回 ...,但是当手指抬起而不是按下时改变背景。"
    猜你喜欢
    • 2018-01-08
    • 2014-12-06
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多