WPF 中的鼠标悬停让我抓狂

Mouseover in WPF is driving me Nuts

我正在努力学习 WPF,所以请不要因为我问的是一个非常愚蠢的问题而责备我,但我已经花了几天时间在网上搜索答案,但似乎没有什么可以解决我的问题。

基本上,我想要做的就是了解我的各种测试应用程序控件的样式,以掌握最有效的方法以及如何使用它们。我在 'Page.Resources'.

中指定了一个名为“更简单”的样式

背景样式的第一部分确实可以正常工作,并且我的按钮具有预期的渐变填充,但是,尽管我在几天的反复试验中尽了最大努力(主要是错误),但我仍然无法获得 'IsMouseOver' 触发做任何事情。事实上,几乎任何其他需要调用触发器的“事件”都完全拒绝做任何事情。

WPF 似乎完全忽略了我样式的整个“”部分?

我真的很感激有人用简单的语言向我解释为什么会发生这种情况,或者更确切地说,为什么没有发生这种情况,以及我如何才能让它发挥作用?

提前致谢。 '''

 Title="Page1">
<Page.Resources>
    <Style  x:Key="mouseover"
        TargetType="Grid">
        <Setter Property="Background" Value="Red"/>
    </Style>

    <Style x:Key="simpler" TargetType="Button">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                    <GradientStop Color="#FFFFD190" Offset="0.35"/>
                    <GradientStop Color="Red" Offset="0.95"/>
                    <GradientStop Color="#FFFFD190" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>

        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" >
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                            <GradientStop Color="#FFFFD190" Offset="0.35"/>
                            <GradientStop Color="Green" Offset="0.95"/>
                            <GradientStop Color="#FFFFD190" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>

    </Style>

</Page.Resources>
<!--xmlns:Models="clr-namespace:WpfUI.Models"-->
<Grid>

    <Grid.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="Black" Offset="0"/>
            <GradientStop Color="Yellow" Offset="0.972"/>
        </LinearGradientBrush>
    </Grid.Background>

    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="10"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions>


    <WrapPanel Grid.Row="0" Grid.Column="1" 
             Grid.ColumnSpan="3" 
             Grid.RowSpan="1" Height="60">
        
        <!--Button ONE-->
        <Button 
            x:Name="btn1"
            Height="50" Width="135" 
            Margin="5"
            Click="Page1_Click"
            Foreground="White"
            Content="ewttwttrt"
            Style="{StaticResource simpler}">
            
            <!-- We put our "text" into a Stackpanel (or any similar control)
            so that we can use the defined Template above, whch stops our 
            text from being rendered -->
            <!--<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"
                    VerticalAlignment="Center">
                <TextBlock FontFamily="Wingdings" FontSize="16" Text="ü"/>
                <TextBlock Text="btn1-MyButtonTemplate"/>
            </StackPanel>-->
        </Button>

'''

我不确定 SO 是否真的适合初学者。

稍后。 你可能会发现这很有趣: https://social.technet.microsoft.com/wiki/contents/articles/32610.wpf-layout-lab.aspx

首先。 创建一个新的 wpf 应用程序。 在 mainwindow 内的网格中放置一个按钮。 它会填满你的网格,但别担心。

旋转它。 鼠标移到。 看到它变成浅蓝色了吗? 这样做的不是背景。 这是背景之上的东西。

尝试将其粘贴到开始 window 标签下方的所有内容中。

    <Window.Resources>
        <Style x:Key="simpler" TargetType="Button">
            <Setter Property="OverridesDefaultStyle"
          Value="true" />
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                        <GradientStop Color="#FFFFD190" Offset="0.35"/>
                        <GradientStop Color="Red" Offset="0.95"/>
                        <GradientStop Color="#FFFFD190" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border BorderBrush="{TemplateBinding BorderBrush}" 
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Background="{TemplateBinding Background}">
                            <ContentPresenter Margin="2"
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                RecognizesAccessKey="True" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" >
                        <Setter.Value>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                <GradientStop Color="#FFFFD190" Offset="0.35"/>
                                <GradientStop Color="Green" Offset="0.95"/>
                                <GradientStop Color="#FFFFD190" Offset="1"/>
                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>

        </Style>
    </Window.Resources>
    <Grid Width="1155" Height="805">
        <Button Style="{StaticResource simpler}">
            Banana
        </Button>
    </Grid>
</Window>

很抱歉,但为了避免浪费您宝贵的时间,我刚刚发现了 PreviewMouseDown 属性,它让我解决了上面针对不支持 Click 的任何控件所描述的问题事件,所以没必要浪费时间回答这个问题,当然,除非你有更好的解决方案??