【问题标题】:How do I keep WPF Button Template from changing All Buttons When Moused Over?鼠标悬停时如何防止 WPF 按钮模板更改所有按钮?
【发布时间】:2012-10-06 16:23:17
【问题描述】:

我正在使用 WPF 模板的自定义模板。但是,在大多数情况下,当我将鼠标悬停在按钮上时,它会更改同一屏幕上所有按钮的文本颜色,这是无意的。

<Style  TargetType="{x:Type Button}">
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="OverridesDefaultStyle"
      Value="true" />
    <Setter Property="FocusVisualStyle"
      Value="{DynamicResource ButtonFocusVisual}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border TextBlock.Foreground="{DynamicResource AlternateFontColor}"
                        TextBlock.FontFamily="Segoe UI"
                        TextBlock.FontWeight="Bold"                            
                        x:Name="Border"
                        CornerRadius="0"
                        BorderThickness="2" >
                    <Border.BorderBrush>
                        <SolidColorBrush Color="{DynamicResource ControlMouseOverColor}" />
                    </Border.BorderBrush>
                    <Border.Background>
                        <SolidColorBrush Color="{DynamicResource ColorBackgroundColor}" />
                    </Border.Background>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0:0:0.0" />
                                <VisualTransition GeneratedDuration="0"
                              To="Pressed" />
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                  (SolidColorBrush.Color)"
                                            Storyboard.TargetName="Border">
                                        <EasingColorKeyFrame KeyTime="0"
                                     Value="{StaticResource ControlMouseOverColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
                                                                 Storyboard.TargetName="Border">
                                        <EasingColorKeyFrame KeyTime="0" Value="{StaticResource ControlBorderMouseOverColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="Border">
                                        <EasingColorKeyFrame KeyTime="0" Value="White" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                  (SolidColorBrush.Color)"
                                            Storyboard.TargetName="Border">
                                        <EasingColorKeyFrame KeyTime="0"
                                     Value="{StaticResource ControlPressedColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
                                                                 Storyboard.TargetName="Border">
                                        <EasingColorKeyFrame KeyTime="0" Value="{StaticResource ControlBorderMouseOverColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <ContentPresenter Margin="2"
                                      HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                                      VerticalAlignment="Center"
                                      RecognizesAccessKey="True"
                                      TextBlock.TextAlignment="Center"

                                      >                                        

                    </ContentPresenter>

                </Border>
                <!-- Triggers -->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

    标签: wpf xaml templates button


    【解决方案1】:

    将样式声明更新为

     <Style  x:Key="buttonStyle"  TargetType="{x:Type Button}">
    

    如果按钮必须设置样式,则为按钮分配样式

     <Button Style="{DynamicResource buttonStyle}">H2</Button>
    

    其他按钮在声明 x:Key 后不会继承样式

    【讨论】:

    • 我不是不想让其他按钮继承样式,我愿意。就是当我将鼠标悬停在一个按钮上时,所有其他按钮的字体颜色(前景)都会更改为同一页面上的所有按钮。它应该只为鼠标悬停的按钮触发,而不是全部触发
    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2021-01-21
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多