2017-12-18 3 views
0

Ich habe versucht, es für 4 Tage arbeiten zu lassen, bitte helfen Sie mir.Etwas ist falsch mit DataTrigger und Storyboard

Ich hatte ein Storyboard und alles war in Ordnung, bis ich die Triggeraktion von Button klicken musste, um auf boolesche Variable zu binden. Es ist alles in einer Vorlage geschrieben und ich denke, es macht die Aufgabe komplizierter. Der Code war (und es funktioniert immer noch):

<Border x:Name="panelControl" Grid.RowSpan="4" Margin="0,0,-450,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Width="450" Height="275" DataContext="{Binding CurrentPanelViewModel}" > 
      <Border.RenderTransform> 
       <TransformGroup> 
        <ScaleTransform/> 
        <SkewTransform/> 
        <RotateTransform/> 
        <TranslateTransform/> 
       </TransformGroup> 
      </Border.RenderTransform> 

       <Canvas Background="#FFC6E8E6"> 
        ... 
       </Canvas> 
      </Grid> 
     </Border> 

    <Grid.Triggers> 
      <EventTrigger RoutedEvent="Button.Click" SourceName="AddButton2"> 
       <BeginStoryboard Name="StartStoryboard"> 
        <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
         <DoubleAnimation 
          Storyboard.TargetName="panelControl" 
          Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" 
          Duration="0:0:005" From="0" To="-700" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 

Jetzt ist es ich geschrieben habe.

<Border x:Name="panelControl" Grid.RowSpan="4" Margin="0,0,-450,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Width="450" Height="275" DataContext="{Binding Path=Controller.LegViewModel.CurrentPanelViewModel}" > 
      <Border.RenderTransform> 
       <TransformGroup> 
        <ScaleTransform/> 
        <SkewTransform/> 
        <RotateTransform/> 
        <TranslateTransform/> 
       </TransformGroup> 
      </Border.RenderTransform> 

      <Grid.Style> 
        <Style> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path = PanelOpened}"> 
           <DataTrigger.EnterActions> 
            <BeginStoryboard > 
             <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
              <DoubleAnimation 
               Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" 
               Duration="0:0:005" From="0" To="-700" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </DataTrigger.EnterActions> 

           <!--<DataTrigger.ExitActions> 
            you could animate close too if you wanted 
           </DataTrigger.ExitActions>--> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </Grid.Style> 

       <Canvas Background="#FFC6E8E6"> 
        .... 
       </Canvas> 
      </Grid> 
     </Border> 

und nichts passiert. Trotz der Tatsache, dass ich überprüft habe, dass PanelOpened benachrichtigt.

---------- ----------- UPDATE

Ich addierte Wert = "True" zu Datatrigger und jetzt habe ich einen Fehler in meiner OnPropertyChanged (wenn propertyname = PanelOpened):

public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     //если PropertyChanged не нулевое - оно будет разбужено 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public bool PanelOpened 
    { 
     get { return _panelOpened; } 
     set 
     { 
      _panelOpened = value; 
      OnPropertyChanged(); 
     } 
    } 

Fehler: System.InvalidOperationException: '' [unbekannt]‘Eigenschaft verweist nicht auf ein DependencyObject in Pfad '. (0) (1) [3] (2)' . "

Antwort

0

Ein Datentrigger wird ausgelöst, wenn der Wert aus der Bindung einem von Ihnen angegebenen Wert entspricht. Aber Sie haben den Wert nicht angegeben. Wenn Sie den Auslöser zu „Feuer“ wollen, wenn der Wert von PanelOpened Veränderungen wahr, so sagen:

<DataTrigger Binding="{Binding PanelOpened}" Value="True"> 
+0

thx, jetzt habe ich ein anderes Problem konfrontiert –

+0

Veröffentlichen Sie Ihre tatsächlichen XAML, nicht das kaputte Zeug in der Frage. Ich musste es reparieren, um es zu testen. –

0

Das ist, was ich versuchte, Datatrigger zu Grid-Stil statt Border hinzuzufügen. Arbeitsversion:

  <Border.Style> 
       <Style TargetType="{x:Type Border}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path = PanelOpened}" Value="True"> 
          <DataTrigger.EnterActions> 
           <BeginStoryboard > 
            <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
             <DoubleAnimation 
              Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" 
              Duration="0:0:005" From="0" To="-700" /> 
            </Storyboard> 
           </BeginStoryboard> 
          </DataTrigger.EnterActions> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Border.Style> 
+0

Macht Sinn. Das habe ich zum Testen geändert. –