2011-04-14 4 views
9

Mam stronę WPF. Strona ma pewną treść, ale ostatnim elementem potomnym układu głównego strony jest utworzona przeze mnie kontrola użytkownika. Wygląda to tak:WPF: Jak odwoływać się do innych elementów sterujących w ramach właściwości Właściwość wyzwalacza?

<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> 

Domyślnie właściwość obiektu UserControlViewModelIsOn jest ustawiony na false, czyli kontrola użytkownik nie jest widoczny. Zaimplementowałem pewną logikę, która zmienia tę właściwość na true, a następnie kontrola użytkownika jest wyświetlana przed wszystkimi innymi komponentami, które są przyciemnione. To działa dobrze.

Teraz chcę utworzyć animację efektu zanikania, która przyciemnie komponenty, które znajdują się za kontrolą użytkownika, gdy staną się widoczne. Następnie chcę zrobić moją czerwoną granicę, w której zawartość będzie rozjaśniała się od lewej strony, więc ruch + zanikanie.

Najpierw zacznijmy od efektu zanikania. Napisałem ten styl do Border które ma wykonać przyciemnianie elementów tła:

<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> 
    ... 

Ale jest problem: Nie mogę ustawić wiązania na spuście Property, ponieważ nie jest to właściwość zależność. Potrzebuję sposobu, aby poinformować, że mój wyzwalacz wystrzelił, gdy grid ma ustawioną właściwość Visibility na Visible. Proszę, pomóżcie i dziękuję!

Drugi problem polega na tym, że nie wiem, jak wykonać ruch czerwoną obwódką, więc potrzebuję pomocy w zakresie niektórych przekształceń skali, tak myślę ... Dzięki raz jeszcze!

Odpowiedz

15

spróbować wymienić następujące linie:

oryginalny:

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

Zamiennik:

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

To działa, to świetnie! – Boris

+0

Działa tylko za pierwszym razem! CZEMU!? – Boris

+0

@ Myermian: Nie jestem do końca pewien, co masz na myśli. Czy mógłbyś to wyjaśnić w kilku kolejnych zdaniach? Dzięki. – Boris