.NET MAUI Picker控件TextColor属性悬停变色异常问题
Picker控件悬停时文本变黑的解决办法
你遇到的问题是Picker设置TextColor="White"后,选中选项文本为白色,但鼠标悬停时文本变黑,这是因为平台默认的悬停视觉状态覆盖了你的设置,以下是两种解决方法:
方法1:用VisualStateManager定义悬停状态样式
直接在Picker的XAML代码中添加视觉状态管理,强制指定悬停时的文本颜色:
<Picker TextColor="White" BackgroundColor="Green" Title="Select a monkey"> <Picker.ItemsSource> <x:Array Type="{x:Type x:String}"> <x:String>Baboon</x:String> <x:String>Capuchin Monkey</x:String> <x:String>Blue Monkey</x:String> <x:String>Squirrel Monkey</x:String> <x:String>Golden Lion Tamarin</x:String> <x:String>Howler Monkey</x:String> <x:String>Japanese Macaque</x:String> </x:Array> </Picker.ItemsSource> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal" /> <VisualState x:Name="Hovered"> <VisualState.Setters> <Setter Property="TextColor" Value="White" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Picker>
方法2:针对Windows平台自定义渲染(若方法1无效)
如果是UWP/WPF平台,默认控件样式可能深层覆盖了设置,需要自定义渲染器修改内部文本的悬停样式:
using Xamarin.Forms.Platform.UWP; using System.Linq; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Controls; [assembly: ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))] namespace YourAppNamespace.UWP { public class CustomPickerRenderer : PickerRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) { base.OnElementChanged(e); if (Control != null) { Control.Loaded += (sender, args) => { var comboBox = sender as ComboBox; foreach (var child in comboBox.GetVisualDescendants()) { if (child is ContentPresenter presenter) { if (presenter.ContentTemplateRoot is TextBlock textBlock) { // 设置默认文本颜色 textBlock.Foreground = new SolidColorBrush(Windows.UI.Colors.White); // 修改悬停状态的文本颜色 var stateGroup = VisualStateManager.GetVisualStateGroups(presenter)[0] as VisualStateGroup; var hoverState = stateGroup.States.FirstOrDefault(s => s.Name == "PointerOver"); if (hoverState != null) { foreach (var setter in hoverState.Setters) { if (setter is Setter set && set.Property == TextBlock.ForegroundProperty) { set.Value = new SolidColorBrush(Windows.UI.Colors.White); } } } } } } }; } } } }
注意事项
- 方法1优先尝试,无需额外代码,直接在XAML中配置即可生效。
- 这个问题通常出现在Windows桌面平台(UWP/WPF),移动端(Android/iOS)没有鼠标悬停状态,不会遇到该问题。
内容的提问来源于stack exchange,提问作者King Zawar
相关产品推荐
相关产品推荐

