2009-03-24 13 views
0

Ich versuche, eine Animation in der XAML-Datei des Fensters aus dem VOB-Code des Fensters ausgelöst, wenn ein Ereignis ausgelöst wird (Aufruf einer Funktion), wie ein Fenster "geladen" -Ereignis .WPF startet Animation von VB.net-Code geben Fehler

Hier ist, wie ich die Animation (als Storyboard) erklärt:

Dim StartAnimation As Storyboard = DirectCast(FindName("ServiceOn"), Storyboard) 
Dim StopAnimation As Storyboard = DirectCast(FindName("ServiceOff"), Storyboard) 

Und hier ist der Code für die Funktion, die fehlschlägt:

Public Function CheckStatus() As Boolean 
    If sControl.Status = ServiceControllerStatus.Running Then 
     Me.Button1.Content = "Stop" 
     Button1.BeginStoryboard(StartAnimation, HandoffBehavior.Compose, isControllable:=False) 
    ElseIf sControl.Status = ServiceControllerStatus.Stopped Then 
     Me.Button1.Content = "Start" 
     Button1.BeginStoryboard(StopAnimation, HandoffBehavior.Compose, isControllable:=False) 
    End If 
End Function 

Der Fehler, ich bin immer das ist folgende:

"Wert darf nicht null sein Parameter-Name:. Storyboard"

Es sieht aus wie es ist etwas richtig nach „Button1.BeginStoryboard fehlt (StartAnimation, ...)

Irgendwelche Ideen?

Antwort

1

Es sieht so aus, als ob der StartAnimation-Wert Nothing ist, wodurch die Ausnahme ausgelöst wird. Bevor Sie BeginStoryBoard aufrufen, müssen Sie sicherstellen, dass es sich nicht um Nothing handelt.

If StartAnimation IsNot Nothing AndAlso sControl.Status = ServiceControllerStatus.Running Then 
    Me.Button1.Content = "Stop" 
    Button1.BeginStoryBoard(StartAnimation, HandoffBehavior.Compose) 
... 
+0

, die es taten, mehr Fehler nicht jetzt. Das Problem ist jetzt, dass das Storyboard überhaupt nicht anfängt. Auch der Inhalt der Schaltfläche ist nicht relevant. Irgendwelche Ideen? – TuxMeister

+0

@TuxMeister, Es scheint ein Problem zu sein, dass FindName das Steuerelement nicht finden kann. Haben Sie sichergestellt, dass der Name korrekt in dem von Ihnen betrachteten Bereich registriert ist? – JaredPar

+0

Ja, beide Storyboards haben eine x: Class und eine x: Name Eigenschaft in der XAML Datei. Es würde es nicht zuerst finden, als ich "FindResource" versuchte, aber es erkannte es, wenn "x: Name" verwendet wurde. – TuxMeister

0

Ich fand heraus, eigentlich, was das Problem war:

Wenn ich die Animation erklärte ich es eben bei der Initialisierung tat, nicht, wenn das Ereignis wurde raized so dass neue Klasse war eigentlich Null =.

Der Trick besteht darin, es in den Logikcode anstelle des Deklarationsteils zu stecken, damit es funktioniert. Dies ist der letzte Code (es workes nur gut):

Imports System 
Imports System.ComponentModel 
Imports System.ComponentModel.BackgroundWorker 
Imports System.IO 
Imports System.Threading 
Imports System.Net 
Imports System.Windows 
Imports System.Windows.Controls 
Imports System.Windows.Data 
Imports System.Windows.Media 
Imports System.Windows.Media.Animation 
Imports System.Windows.Navigation 
Imports System.ServiceProcess 
Partial Public Class Window1 
    Public Sub New() 
     MyBase.New() 
     Me.InitializeComponent() 
     End Sub 
Private WithEvents worker As New BackgroundWorker 
Dim sControl As New ServiceController("Spooler") 
Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 
    worker.WorkerReportsProgress = True 
    CheckStatus() 
End Sub 
Public Function CheckStatus() As Boolean 
    If sControl.Status = ServiceControllerStatus.Running Then 
     Dim StartAnimation As Storyboard = DirectCast(FindResource("ServiceIsStarted"), Storyboard) 
     Me.Button1.Content = "Stop" 
     Me.BeginStoryboard(StartAnimation) 
    ElseIf sControl.Status = ServiceControllerStatus.Stopped Then 
     Dim StopAnimation As Storyboard = DirectCast(FindResource("ServiceIsStopped"), Storyboard) 
     Me.Button1.Content = "Start" 
     Me.BeginStoryboard(StopAnimation) 
    End If 
End Function 
Private Sub worker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork 
    If sControl.Status = ServiceControllerStatus.Running Then 
     sControl.Stop() 
     sControl.Refresh() 
     worker.ReportProgress(100) 
    ElseIf sControl.Status = ServiceControllerStatus.Stopped Then 
     sControl.Start() 
     sControl.Refresh() 
     worker.ReportProgress(100) 
    End If 
End Sub 
Private Sub worker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles worker.ProgressChanged 
    If sControl.Status = ServiceControllerStatus.Running Then 
     Dim StartAnimation As Storyboard = DirectCast(FindResource("ServiceIsStarted"), Storyboard) 
     Me.Button1.Content = "Stop" 
     Me.BeginStoryboard(StartAnimation) 
    ElseIf sControl.Status = ServiceControllerStatus.Stopped Then 
     Dim StopAnimation As Storyboard = DirectCast(FindResource("ServiceIsStopped"), Storyboard) 
     Me.Button1.Content = "Start" 
     Me.BeginStoryboard(StopAnimation) 
    End If 
End Sub 
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click 
    worker.RunWorkerAsync() 
End Sub 

End Class