19

我看到 Button 对象有一个 IsMouseOVer 属性。

但是如何为没有 IsMouseOver 的网格或其他元素的鼠标悬停创建效果?

谢谢马尔科姆

编辑:我想通了。我使用了错误的方法来设置触发器。

4

3 回答 3

52

我意识到我正在回复一个死线程,但是因为我遇到了它,并且由于线程没有被回答,所以我要回答它。

WPF 网格有一个“ IsMouseOver”属性。

我认为问这个问题是因为“IsMouseOver”属性仅在鼠标位于网格本身内的“可命中测试”控件(即按钮或组合框)上时才会更改。

因此,“IsMouseOver”属性可能看起来不起作用(特别是如果您在触发器中使用它来设置 Grid 的 Visible 属性)。

例如:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="25" />
    <ColumnDefinition />
  </Grid.ColumnDefinitions>
  
  <Button Grid.Column="1">A Button</Button>

  <Grid.Style>
    <Style TargetType="{x:Type Grid}">
      <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="False">
          <Setter Property="Opacity" Value="0.5"></Setter>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
          <Setter Property="Opacity" Value="1"></Setter>
        </Trigger>
      </Style.Triggers>
    </Style>
  </Grid.Style>
</Grid>

上面的网格和它的内容将以半透明的方式显示。如果将鼠标悬停在第一列(不包含任何内容)上,您会注意到不透明度不会设置为完全;但是,如果您将鼠标悬停在第二列中的按钮上,则不透明度将设置为完全。这是因为第一列没有任何内容,不能进行命中测试。而第二列中的按钮是可命中测试的,因此会触发事件。

如果您希望 Grid 的 IsMouseOver 属性检测鼠标何时位于 Grid 本身上方的任何位置,您只需将 Grid 的 Background 属性设置为非 Null 的值(例如将其设置为透明)。设置 Background 属性将使 Grid “hit-testable”。

以下代码将解决该问题:

<Grid Background="Transparent">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="25" />
    <ColumnDefinition />
  </Grid.ColumnDefinitions>
  
  <Button Grid.Column="1">A Button</Button>

  <Grid.Style>
    <Style TargetType="{x:Type Grid}">
      <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="False">
          <Setter Property="Opacity" Value="0"></Setter>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
          <Setter Property="Opacity" Value="1"></Setter>
        </Trigger>
      </Style.Triggers>
    </Style>
  </Grid.Style>
</Grid>

-弗林尼

于 2011-03-22T17:18:20.113 回答
3

也可以这样使用MouseEnter/MouseLeave事件:

<Grid Name="grid">
    <Grid.Triggers>
        <EventTrigger RoutedEvent="MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <ThicknessAnimation Storyboard.TargetProperty="Margin" From="0,0,-300,0" To="0,0,0,0" DecelerationRatio=".9" Duration="0:0:1" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseLeave">
            <BeginStoryboard>
                <Storyboard>
                    <ThicknessAnimation Storyboard.TargetProperty="Margin" From="0,0,0,0" To="0,0,-300,0" AccelerationRatio=".9" Duration="0:0:1" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>
</Grid>
于 2020-01-03T18:48:24.840 回答
0

那将是 WPF 对象上的“MouseEnter”和“MouseLeave”操作。

于 2011-01-18T20:51:56.297 回答