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

时间:2008-12-31 11:00:00

标签: wpf triggers

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

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

由于 马尔科姆

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

3 个答案:

答案 0 :(得分:34)

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

WPF Grid具有“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>

上面的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>

-Frinny

答案 1 :(得分:2)

一个人也可以这样使用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>

答案 2 :(得分:0)

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