WPF - 如何编写鼠标悬停在网格上的触发器?

Mal*_*olm 14 wpf triggers

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

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

谢谢马尔科姆

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

Fri*_*ale 35

我意识到我正在响应一个死线程但是因为我遇到它,并且由于线程没有得到解答,我将回答它.

WPF网格有一个"IsMouseOver"属性.

我认为这个问题是被问到的,因为"IsMouseOver"属性只有在鼠标位于Grid本身的某个控件(即Button或ComboBox)之后才会改变.

因此,可能看起来"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>
Run Code Online (Sandbox Code Playgroud)

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

如果希望Grid的IsMouseOver属性检测鼠标何时位于Grid本身的任何位置,您只需要将Grid的Background属性设置为非Null(例如将其设置为Transparent).设置Background属性将使Grid"可以测试".

以下代码将解决此问题:

<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>
Run Code Online (Sandbox Code Playgroud)

-Frinny


Cod*_*e92 0

这就是 WPF 对象上的“MouseEnter”和“MouseLeave”操作。