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

.NET 9 MAUI Windows应用RadioButton悬停时消失问题求助

.NET 9 MAUI Windows RadioButton鼠标悬停消失问题解决

直接给RadioButton设置PointerOver状态的Opacity=1没用,是因为Windows平台MAUI的RadioButton默认模板中,PointerOver状态会修改内部图标或文本元素的样式(比如把图标设为透明),而不是整个控件的透明度,你设置控件本身的Opacity覆盖不了模板内元素的状态。

给你两种可行的解决方式:

方式一:自定义完整的ControlTemplate

直接重写RadioButton的模板,明确控制所有状态下的视觉表现:

<Style TargetType="RadioButton">
    <Setter Property="BackgroundColor" Value="Transparent"/>
    <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
    <Setter Property="FontFamily" Value="OpenSansRegular"/>
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="MinimumHeightRequest" Value="44"/>
    <Setter Property="MinimumWidthRequest" Value="44"/>
    <Setter Property="ControlTemplate">
        <ControlTemplate>
            <Grid MinimumWidthRequest="{TemplateBinding MinimumWidthRequest}"
                  MinimumHeightRequest="{TemplateBinding MinimumHeightRequest}"
                  Padding="8">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <!-- 自定义单选框图标 -->
                <Path x:Name="CheckMark"
                      Grid.Column="0"
                      Width="16"
                      Height="16"
                      Stroke="{TemplateBinding TextColor}"
                      StrokeThickness="2"
                      Data="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5.5-2.5l5-5 2.5 2.5-7.5 7.5-4-4 2.5-2.5z"
                      Fill="Transparent"/>
                <!-- 文本 -->
                <Label Grid.Column="1"
                       Text="{TemplateBinding Content}"
                       TextColor="{TemplateBinding TextColor}"
                       FontFamily="{TemplateBinding FontFamily}"
                       FontSize="{TemplateBinding FontSize}"
                       VerticalOptions="Center"
                       Margin="8,0,0,0"/>
                
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualState x:Name="Normal"/>
                        <VisualState x:Name="Disabled">
                            <VisualState.Setters>
                                <Setter TargetName="CheckMark" Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
                                <Setter TargetName="Label" Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
                            </VisualState.Setters>
                        </VisualState>
                        <VisualState x:Name="PointerOver">
                            <VisualState.Setters>
                                <!-- 确保图标和文本都不透明 -->
                                <Setter TargetName="CheckMark" Property="Opacity" Value="1"/>
                                <Setter TargetName="CheckMark" Property="Stroke" Value="{TemplateBinding TextColor}"/>
                                <Setter TargetName="Label" Property="Opacity" Value="1"/>
                            </VisualState.Setters>
                        </VisualState>
                        <VisualState x:Name="Selected">
                            <VisualState.Setters>
                                <Setter TargetName="CheckMark" Property="Fill" Value="{TemplateBinding TextColor}"/>
                            </VisualState.Setters>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Grid>
        </ControlTemplate>
    </Setter>
</Style>

方式二:针对默认模板的内部元素设置状态

如果你不想完全重写模板,可以尝试在VisualState里指定默认模板中的元素名称(Windows平台RadioButton默认模板里的图标通常叫Check,文本块叫ContentPresenter):

<Style TargetType="RadioButton">
    <Setter Property="BackgroundColor" Value="Transparent"/>
    <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
    <Setter Property="FontFamily" Value="OpenSansRegular"/>
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="MinimumHeightRequest" Value="44"/>
    <Setter Property="MinimumWidthRequest" Value="44"/>
    <Setter Property="VisualStateManager.VisualStateGroups">
        <VisualStateGroupList>
            <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Normal" />
                <VisualState x:Name="Disabled">
                    <VisualState.Setters>
                        <Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
                    </VisualState.Setters>
                </VisualState>
                <VisualState x:Name="PointerOver">
                    <VisualState.Setters>
                        <!-- 针对默认模板里的图标和文本元素设置透明度 -->
                        <Setter TargetName="Check" Property="Opacity" Value="1"/>
                        <Setter TargetName="ContentPresenter" Property="Opacity" Value="1"/>
                        <!-- 可选:设置图标的颜色避免变透明 -->
                        <Setter TargetName="Check" Property="Stroke" Value="{TemplateBinding TextColor}"/>
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateGroupList>
    </Setter>
</Style>

注意:方式二依赖于MAUI默认模板的元素命名,不同版本可能有变化,如果这个方法不生效,优先用方式一的自定义模板,兼容性更强。

内容的提问来源于stack exchange,提问作者BLaZzeD_-_ leone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:42:41