You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:24:23