【问题标题】:Wrong SVG Icon Highlights at RadioButton (MouseOver) WPFRadioButton (MouseOver) WPF 中错误的 SVG 图标突出显示
【发布时间】:2023-02-21 21:41:46
【问题描述】:

你好社区

问题是 RadioButtons 的突出显示,当鼠标悬停在其中一个 RadioButtons 上时,所有 RadionButtons 都会更改突出显示颜色。实际上只有选定的单选按钮应该改变高亮颜色。看图片:

enter image description here

几乎与我用于按钮的代码相同,突出显示的颜色可以正常工作,请看图片。 enter image description here

带有 SVG 图像的 RadioButton 的样式代码如下:

资源:

<!--  Start Path Style for NavigationRadioButtonTextIcon -->
    <Style TargetType="RadioButton" x:Key="NavigationRadioButtonTextIcon" >
        <Setter Property="Width" Value="auto"/>
        <Setter Property="Height" Value="40" />
        <Setter Property="Padding" Value="8 4"/>
        <Setter Property="FontSize" Value="22"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="Background" Value="{StaticResource DarkGrayColorBrush}"/>
        <Setter Property="Foreground" Value="#8C7E8B"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="RadioButton">
                    <Grid x:Name="MainGrid" 
                          Background="{TemplateBinding Background}"
                          SnapsToDevicePixels="True">
                        <TextBlock Text="{TemplateBinding Content}"
                                   Padding="{TemplateBinding Padding}"
                                   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                        <Path x:Name="pathIcon"
                              HorizontalAlignment="Center"
                              VerticalAlignment="Center"
                              Data="{TemplateBinding Content}"
                              Fill="{TemplateBinding Foreground}" />
                        <ContentPresenter x:Name="contentPresenter" 
                                          HorizontalAlignment="Left" 
                                          VerticalAlignment="Center"
                                          RecognizesAccessKey="True" 
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Background" Value="{StaticResource LightGrayColorBrush}" TargetName="MainGrid"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation To="{StaticResource LightGrayColor}" 
                                        Duration="0:0:0.25" 
                                        Storyboard.TargetProperty="Background.Color"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="MouseLeave">
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation To="{StaticResource DarkGrayColor}" 
                                        Duration="0:0:0.25" 
                                        Storyboard.TargetProperty="Background.Color"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>
<!--  EndPath Style for NavigationRadioButtonTextIcon -->
 <!--  Start Path Style for ContentRadioButtonPath -->
    <Style TargetType="{x:Type Path}" 
           x:Key="ContentRadioButtonPathStyle">
        <Setter Property="Width" Value="26"/>
        <Setter Property="Height" Value="26"/>
        <Setter Property="Stretch" Value="Fill"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=IsMouseOver}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)">
                                <LinearColorKeyFrame KeyTime="0:0:0.2" 
                                                     Value="{StaticResource ButtonIconSecundaryColor}"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)">
                                <LinearColorKeyFrame KeyTime="0:0:0.2" 
                                                     Value="{StaticResource ButtonIconPrimaryColor}"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <!--  End Path Style for ContentRadioButtonPath -->

**单选按钮**

<RadioButton Grid.Row="1">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="5"/>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="10"/>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="10"/>
                            </Grid.ColumnDefinitions>

                            <Path Style="{StaticResource ContentRadioButtonPathStyle}" 
                                  Grid.Column="1"
                                  Data="{StaticResource HomeIconSVG}" 
                                  Fill="{StaticResource ButtonIconPrimaryColorBrush}" />
                            <TextBlock Text="Home"
                                       Grid.Column="3"
                                       Style="{StaticResource TextForRadioButton}" />
                        </Grid>
</RadioButton>
   <RadioButton Grid.Row="2">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="5"/>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="10"/>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="10"/>
                            </Grid.ColumnDefinitions>

                            <Path Style="{StaticResource ContentRadioButtonPathStyle}" 
                                  Grid.Column="1"
                                  Data="{StaticResource CreateIconSVG}" 
                                  Fill="{StaticResource ButtonIconPrimaryColorBrush}" />
                            <TextBlock Text="Create"
                                       Grid.Column="3"
                                       Style="{StaticResource TextForRadioButton}" />
                        </Grid>
</RadioButton>

社区中有人可以帮助我解决这个问题或一些解决问题的技巧。

感谢您的帮助

【问题讨论】:

  • 您正在更改共享的 SolidColorBrush 资源的 Color,这将影响使用该资源的所有元素。尝试在 DarkGrayColorBrush 资源上设置 x:Shared="False"。或者在 Background 属性 Setter 中分配一个新的 SolidColorBrush。
  • 谢谢 Clements,我将代码更改为:<b/r> &lt;Color x:Shared="False" x:Key="DarkGrayColor" &gt;#AAAAAA&lt;/Color&gt; &lt;Color x:Shared="False" x:Key="LightGrayColor" &gt;#D9D9D9&lt;/Color&gt; and &lt;SolidColorBrush x:Shared="False" x:Key="DarkGrayColorBrush" Color="{StaticResource DarkGrayColor}"/&gt; &lt;SolidColorBrush x:Shared="False" x:Key="LightGrayColorBrush" Color="{StaticResource LightGrayColor}"/&gt; <br/> 行为保持不变。 <br/> 对不起,我不明白你的第二个建议

标签: wpf xaml


【解决方案1】:

因为您的 Storyboard 明确针对控件的 BackgroundColor 属性,所以您还应该在 Background Setter 中明确分配一个 SolidColorBrush

<Setter Property="Background">
    <Setter.Value>
        <SolidColorBrush Color="{StaticResource DarkGrayColor}"/>
    </Setter.Value>
</Setter>

这同样适用于分配给 Path 的 Fill 属性的共享资源:

<Path ...>
    <Path.Fill>
       <SolidColorBrush Color="{StaticResource ButtonIconPrimaryColor}" />
    </Path.Fill>
<Path>

【讨论】:

  • 感谢 Clements,行为保持不变,即使在所有 RadioButtons 中,鼠标悬停事件也会在突出显示上切换
  • 抱歉,我显然看错了地方并谈论了不同的事情,即在 IsChanged 上更改背景,而您在 MouseOver 上请求路径填充。但是,解决方案是相同的,要么不要更改共享资源(Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"),要么首先不要分配共享资源。
  • 并尝试正确写下我的名字。那应该不会太难。
猜你喜欢
  • 2010-12-27
  • 2012-01-20
  • 2013-01-26
  • 1970-01-01
  • 2013-03-16
  • 2011-06-15
  • 2022-11-30
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多