2011-04-14 6 views
9

Ho una pagina WPF. La pagina ha del contenuto, ma l'ultimo componente figlio del layout radice della pagina è un controllo utente che ho creato. Sembra che questo:WPF: come fare riferimento ad altri controlli all'interno della proprietà Property di trigger?

<UserControl DataContext=UserControlViewModel> 
    <UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="visibilityConverter" /> 
    </UserControl.Resources> 
    <Grid 
     Name="grid" 
     Visibility="{Binding IsOn, Converter={StaticResource visibilityConverter}}"> 
    <!-- Border to dim everything behind my user control --> 
    <Border Background="#000000" Opacity="0.4" /> 
    <!-- The following border is red and holds the content --> 
    <Border 
     Width="{Binding ElementName=txt, Path=ActualWidth}" 
     Height="{Binding ElementName=txt, Path=ActualHeight}" 
     Margin="{Binding ElementName=txt, Path=Margin}" 
     HorizontalAlignment="{Binding ElementName=txt, Path=HorizontalAlignment}" 
     VerticalAlignment="{Binding ElementName=txt, Path=VerticalAlignment}" 
     Background="Red"> 
     <TextBlock 
      Name="txt" 
      Width="200" 
      Height="100" 
      Margin="20" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" 
      Text="This is my super awesome message!" /> 
    </Border> 
    </Grid> 
</UserControl> 

Per default, la proprietà dell'oggetto UserControlViewModelIsOn è impostato false, cioè il controllo di utente non è visibile. Ho implementato una logica che modifica questa proprietà in true e quindi il controllo utente viene visualizzato davanti a tutti gli altri componenti che risultano in grigio. Funziona bene

Ora, voglio creare un'animazione effetto dissolvenza che offusca i componenti dietro il controllo utente una volta che diventa visibile. Successivamente, voglio rendere il mio bordo rosso che tiene il contenuto in dissolvenza dal lato sinistro, in modo da spostare + dissolvenza.

Iniziamo prima con l'effetto di dissolvenza. Ho scritto questo stile al Border che dovrebbe fare l'oscuramento dei componenti di fondo:

<UserControl DataContext=UserControlViewModel> 
    <UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="visibilityConverter" /> 
    </UserControl.Resources> 
    <Grid 
     Name="grid" 
     Visibility="{Binding IsOn, Converter={StaticResource visibilityConverter}}"> 
    <!-- Border to dim everything behind my user control --> 
    <Border Background="#000000" Opacity="0.4"> 
     <!-- The following style is new code --> 
     <Border.Style> 
     <Style TargetType="Border"> 
      <Style.Triggers> 
      <Trigger Property="{Binding ElementName=grid, Visibility}" Value="Visible"> 
       <Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
        <DoubleAnimation 
         Storyboard.TargetProperty="Opacity" 
         From="0.0" 
         To="0.4" 
         Duration="0:0:1" /> 
        </Storyboard> 
       </BeginStoryboard> 
       </Trigger.EnterActions> 
      </Trigger> 
      </Style.Triggers> 
     </Style> 
     </Border.Style> 
    </Border> 
    ... 

Ma c'è il problema: non riesco ad impostare il legame sul grilletto Property, perché non è una proprietà di dipendenza. Ho bisogno di un modo per dire al mio innesco di sparare una volta che il grid ha la proprietà impostata su Visible. Si prega di aiutare e grazie!

Il secondo problema è che non so come spostare il bordo rosso, quindi ho bisogno di aiuto per alcune trasformazioni di scala, immagino ... Grazie ancora!

risposta

15

provare a sostituire la seguente riga:

originale:

<Trigger Property="{Binding ElementName=grid, Visibility}" Value="Visible"> 

sostituzione:

<DataTrigger Binding={Binding Visibility, ElementName=grid} Value="Visibile"> 
+0

Funziona, grande! – Boris

+0

Funziona solo la prima volta! PERCHÉ!? – Boris

+0

@myermian: non sono abbastanza sicuro di cosa intendessi. Potresti spiegarlo in poche altre frasi per favore? Grazie. – Boris

Problemi correlati