WPF запускает анимацию из кода vb.net с ошибкой

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

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

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

Любые идеи?


person TuxMeister    schedule 24.03.2009    source источник


Ответы (2)


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

If StartAnimation IsNot Nothing AndAlso sControl.Status = ServiceControllerStatus.Running Then
  Me.Button1.Content = "Stop"
  Button1.BeginStoryBoard(StartAnimation, HandoffBehavior.Compose)
...
person JaredPar    schedule 24.03.2009
comment
это сделало это, больше никаких ошибок. Проблема в том, что раскадровка вообще не начинается. То же самое и с содержимым кнопки. Любые идеи? - person TuxMeister; 24.03.2009
comment
@TuxMeister, Проблема, похоже, в том, что FindName не может найти элемент управления. Вы убедились, что имя правильно зарегистрировано в рассматриваемой области? - person JaredPar; 24.03.2009
comment
Да, обе раскадровки имеют свойство x: Class и x: Name в файле XAML. Он не нашел его первым, когда я попробовал FindResource, но он распознал его при использовании x: Name. - person TuxMeister; 24.03.2009
comment
Я исправил проблему с ContentPresenter. Он был установлен как всегда по умолчанию для конкретной строки вместо возможности ее изменения. - person TuxMeister; 24.03.2009

Я действительно понял, в чем проблема:

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

Хитрость заключается в том, чтобы вставить его в код логики, а не в часть объявления, чтобы он работал. Это последний код (он отлично работает):

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

Конец класса

person TuxMeister    schedule 25.03.2009