2011-10-05 8 views
8

Diciamo che ho questo pezzo di codice:Effetto Innescato WPF passaggio del mouse per bambini Controlli

<Window> 
    <Window.Resources> 
     <Color x:Key="MyColor" 
       A="255" 
       R="152" 
       G="152" 
       B="152" /> 
     <DropShadowEffect x:Key="MyEffect" 
          ShadowDepth="0" 
          Color="{StaticResource MyColor}" 
          BlurRadius="10" /> 
     <Style x:Key="MyGridStyle" 
       TargetType="{x:Type Grid}"> 
      <Setter Property="Height" 
        Value="200" /> 
      <Setter Property="Width" 
        Value="200" /> 
      <Style.Resources> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="Width" 
          Value="100" /> 
       </Style> 
       <Style TargetType="{x:Type Image}"> 
        <Setter Property="Height" 
          Value="100" /> 
        <Setter Property="Width" 
          Value="100" /> 
       </Style> 
      </Style.Resources> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" 
         Value="true"> 
        <!-- How do I apply my effect when this grid is hovered over to Image and TextBox, but not the grid itself? --> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <Grid Style="{StaticResource MyGridStyle}"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Image Grid.Row="0" 
       Grid.Column="0" 
       Source="image.png" /> 
     <TextBlock Grid.Row="0" 
        Grid.Column="0" 
        Text="Hover Over Me" /> 
    </Grid> 
</Window> 

Fondamentalmente ho uno stile applicato alla griglia che dice qualsiasi TextBlock o immagine all'interno di esso dovrebbe essere stili a una certa dimensione .

Voglio creare un trigger sulla griglia che fa sì che un effetto venga applicato a tutti i blocchi di testo e le immagini all'interno della griglia, ma non alla griglia stessa.

posso applicare il trigger direttamente TextBlock e/o immagine, ma allora l'effetto si verifica solo su ogni elemento separatamente. Ho bisogno che l'effetto si verifichi su qualsiasi TextBlock e/o Image all'interno della Grid nonostante l'elemento figlio interiore su cui sono posizionato il cursore.

Qualcuno può aiutarmi con questo?

risposta

20

Si può fare il contrario. Cioè, aggiungere DataTriggers-Image e TextBlock e renderli innescano sul IsMouseOver per l'antenato Grid.

Nota: Se si desidera che questo effetto per innescare appena il mouse si trova sopra il Grid è necessario impostare Background ad un valore, come Transparent. Per impostazione predefinita, lo Background è null e questo valore non è utilizzato nei test di successo.

<Style x:Key="MyGridStyle" TargetType="{x:Type Grid}"> 
    <!--<Setter Property="Background" Value="Transparent"/>--> 
    <Setter Property="Height" Value="200" /> 
    <Setter Property="Width" Value="200" /> 
    <Style.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Width" Value="200" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Grid}, 
               Path=IsMouseOver}" Value="True"> 
        <Setter Property="Effect" Value="{StaticResource MyEffect}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
     <Style TargetType="{x:Type Image}"> 
      <Setter Property="Height" Value="200" /> 
      <Setter Property="Width" Value="200" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Grid}, 
               Path=IsMouseOver}" Value="True"> 
        <Setter Property="Effect" Value="{StaticResource MyEffect}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Style.Resources> 
</Style> 
Problemi correlati