2009-03-24 3 views
0

Я пытаюсь вызвать анимацию, объявленную в XAML-файле окна из окна vb-кода окна, когда возникает событие (вызов функции), например, «загруженное» событие окна ,Начальная анимация WPF из кода vb.net, дающая ошибку

Вот как я объявляю анимации (как раскадровки):

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

А вот код функции, не удается:

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 

ошибка, что я получаю это следующий:

"Значение не может быть пустым имя параметра:. раскадровка"

Похоже, это что-то сразу после «Button1.BeginStoryboard (StartAnimation, ...)

Любые идеи не хватает?

ответ

1

Похоже, что значение StartAnimation - это Nothing, вызывающее выброс Исключения. Вам нужно проверить, что это не-Ничто, прежде чем вызывать BeginStoryBoard.

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

, что сделал это, не больше ошибки сейчас. Проблема в том, что раскадровка на самом деле вовсе не начинается. Также не отображается содержимое кнопки. Есть идеи? – TuxMeister

+0

@TuxMeister. Проблема заключается в том, что FindName не находит элемент управления. Вы удостоверились, что имя правильно зарегистрировано в области, на которую вы смотрите? – JaredPar

+0

Да, обе кадры имеют свойство x: Class и x: Name в файле XAML. Он не нашел бы его первым, поскольку я попробовал «FindResource», но он узнал его при использовании «x: Name». – TuxMeister

0

я на самом деле понял, что проблема была:

Когда я объявил анимацию я сделал это на уровне инициализации, не тогда, когда событие было raized так, чтобы новый класс был на самом деле = Null.

Фокус в том, чтобы вставить его в логический код вместо части декларации, чтобы он работал. Это окончательный код (это workes просто замечательно):

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

Смежные вопросы