2010-03-24 3 views
8

Viene visualizzato l'errore Impossibile risolvere TargetName grdGeneral. Quello che sto cercando di fare è una funzione di dissolvenza che accetta una griglia e sfuma l'opacità a zero. Ho questa funzione chiamata MouseLeftButtonDown e viene caricata dopo xaml e il modulo è stato caricato.Impossibile risolvere TargetName - Silverlight4 C#

Chiamando il fade out:

private void imgNext_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      fadeOut(grdGeneral);    
     } 

La funzione Fade Out:

private void fadeOut(Grid pGrid) 
     { 
      Storyboard stb = new Storyboard(); 

      DoubleAnimation da = new DoubleAnimation(); 
      da.From = 1.0; 
      da.To = 0.0; 

      stb.Duration = new Duration(TimeSpan.FromSeconds(.75)); 
      stb.Children.Add(da); 

      Storyboard.SetTargetName(da, pGrid.Name); 
      Storyboard.SetTargetProperty(da, new PropertyPath(Grid.OpacityProperty)); 

      stb.Begin(); 
     } 

Sono stato su una manciata di siti di tutorial e il mio codice sembra seguire lo stesso ordine. Sono stato anche su questo stackoverflow question prima di dire repost. Quella domanda ha a che fare con le mutlipages e sto solo cercando di avviare un'animazione.

L'Analisi dello stack

System.InvalidOperationException was unhandled by user code 
    Message=Cannot resolve TargetName grdGeneral. 
    StackTrace: 
     at MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, CValue[] cvData) 
     at MS.Internal.XcpImports.MethodEx(DependencyObject obj, String name) 
     at System.Windows.Media.Animation.Storyboard.Begin() 
     at MeterTesting.QuarterReportGUI.fadeOut(Grid pGrid) 
     at MeterTesting.QuarterReportGUI.imgNext_MouseLeftButtonDown(Object sender, MouseButtonEventArgs e) 
     at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) 
     at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName) 
    InnerException: 
+0

Presumibilmente un bug all'interno Silverlight4. Per chi è interessato a usare la modalità di Phil e funziona meglio di cercare di trovare il modo nel codice. http://betaforums.silverlight.net/forums/p/23517/84087.aspx –

+0

Si è verificato lo stesso problema. Ho sicuramente bisogno di roba creata in fase di esecuzione. Qual è la soluzione? Il link sopra è rotto. –

risposta

3

Davvero non si dovrebbe cercare di codice storyboard come questo se non assolutamente necessario. Una volta che le tue animazioni saranno un po 'complesse, ti morderanno.

Si dovrebbe invece farlo in xaml, preferibilmente usando Blend. Prova questo nel tuo XAML:

<UserControl.Resources> 
    <Storyboard x:Name="FadeGrid"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grdGeneral"> 
      <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
      <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
</UserControl.Resources> 

<Grid x:Name="grdGeneral" Background="White"> 
    <Image x:Name="imgNext" MouseLeftButtonDown="imgNext_MouseLeftButtonDown" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="/StoryboardInCode;component/Images/avatar.jpg"></Image> 
</Grid> 

Nel codice dietro, si dovrebbe quindi richiamare in questo modo:

private void imgNext_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     FadeGrid.Begin(); 
    } 

Questo dovrebbe darti quello che stai cercando.

Sarebbe anche preferibile utilizzare un pulsante anziché l'immagine.

+1

Grazie per il codice, tuttavia avrò più griglie e stavo cercando di ridurre il codice. Questo è il motivo per cui stavo cercando di farlo dinamicamente. –

1

prima, il nome del <DoubleAnimationUsingKeyFrames x:name="da1Load"> in codice dietro:

da1Load.SetValue(Storyboard.TargetNameProperty, "grdWithNewName") 
5

invece di utilizzare

Storyboard.SetTargetName(da, pGrid.Name); 

provare

Storyboard.SetTarget(da, pGrid); 
+0

Grazie, Eric! Questo ha funzionato perfettamente! :-) –