DataTrigger RelativeSource WPF XAML

时间:2016-10-17 09:07:39

标签: wpf xaml

我要做的事情当鼠标悬停在网格边框 Visibilty 属性值时必须更改。

我有一个带有3个ColumnDefinition的网格。

enter image description here

代码是

<Grid x:Name="grid1">
     <Grid.ColumnDefinitions>
          <ColumnDefinition Width="5*"/>
           <ColumnDefinition Width="27*"/>
           <ColumnDefinition Width="93*"/>
      </Grid.ColumnDefinitions>
      <Border Grid.Column="0" Background="Blue" Visibility="Hidden">
           <Border.Style>
                <Style>
                   <Style.Triggers>
                    <DataTrigger Binding="{Binding IsMouseOver , RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}" Value="True">
                     <Setter Property="Border.Visibility" Value="Visible" />
                     </DataTrigger>
                     </Style.Triggers>
                   </Style>
               </Border.Style>
          </Border>
        <Image  Grid.Column="1" />
         <TextBlock Grid.Column="2" />

   </Grid>

当鼠标悬停在网格上时,没有任何事情发生。所以这个代码不起作用

1 个答案:

答案 0 :(得分:2)

有一点是,当需要MouseOver时,不应在DataTrigger中使用IsReadOnly属性。

另一个是本地值Visibility="Hidden"的优先级高于DataTrigger setter <Setter Property="Border.Visibility" Value="Visible" />,即使条件为真也不会更改

两者的修复(Visibility的初始值在setter中定义)

<Border Grid.Column="0" Background="Blue">
    <Border.Style>
        <Style>
            <Setter Property="Border.Visibility" Value="Hidden" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}" Value="False">
                    <Setter Property="Border.Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

您还应将网格背景设置为非空值(例如<Grid x:Name="grid1" Background="Transparent">),以便在网格中注册鼠标移动({x:Null} vs. Transparent?