如何禁用Xamarin.Forms ListView的UWP端悬停高亮效果?
禁用Xamarin.Forms UWP中ListView的鼠标悬停高亮效果
嘿,这个问题我太熟了!UWP自带的ListView项悬停高亮确实会跟自定义卡片的样式冲突,要全局禁用这个效果的话,用Xamarin.Forms的自定义渲染器就能搞定,下面是具体的实现步骤:
全局禁用所有ListView的悬停效果
直接在你的UWP项目里创建一个自定义渲染器,它会自动作用于应用内所有的ListView:
using Xamarin.Forms.Platform.UWP; using Xamarin.Forms; using YourAppNamespace.UWP; // 记得替换成你的UWP项目实际命名空间 [assembly: ExportRenderer(typeof(ListView), typeof(CustomListViewRenderer))] namespace YourAppNamespace.UWP { public class CustomListViewRenderer : ListViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) { base.OnElementChanged(e); if (Control != null) { // 覆盖UWP默认的悬停背景为透明,直接禁用高亮 Control.ItemContainerStyle = new Windows.UI.Xaml.Style(typeof(Windows.UI.Xaml.Controls.ListViewItem)) { Setters = { new Windows.UI.Xaml.Setter(Windows.UI.Xaml.Controls.ListViewItem.HoverBackgroundProperty, Windows.UI.Xaml.Media.Brushes.Transparent), // 可选:如果不需要选中时的高亮,也一起禁用 new Windows.UI.Xaml.Setter(Windows.UI.Xaml.Controls.ListViewItem.SelectedBackgroundProperty, Windows.UI.Xaml.Media.Brushes.Transparent) } }; } } } }
这段代码的核心是通过设置ListViewItem的HoverBackgroundProperty为透明,彻底覆盖UWP的默认悬停样式。如果你连选中状态的高亮也不需要,把SelectedBackgroundProperty也设为透明即可。
仅针对特定ListView禁用悬停效果
如果不想全局修改,只想给某几个ListView禁用悬停效果,可以先定义一个标记用的自定义ListView子类:
using Xamarin.Forms; namespace YourAppNamespace { public class NoHoverListView : ListView { // 空类,仅用于区分普通ListView } }
然后把自定义渲染器的ExportRenderer属性改成针对这个子类:
[assembly: ExportRenderer(typeof(NoHoverListView), typeof(CustomListViewRenderer))]
之后在XAML里使用这个自定义控件代替普通ListView就行:
<local:NoHoverListView ItemsSource="{Binding YourItems}"> <!-- 你的DataTemplate定义 --> </local:NoHoverListView>
注意事项
- 记得把代码里的命名空间替换成你自己项目的实际命名空间,不然会编译报错
- 测试时要在UWP模拟器或真机上验证,有时候调试器里的样式可能不会实时更新
- 透明背景不会影响你自定义DataTemplate里的卡片样式,只是去掉了UWP默认的悬停高亮层
内容的提问来源于stack exchange,提问作者neqopa
相关产品推荐
相关产品推荐

