2012-03-19 88 views
2

我有一個將成爲紙牌遊戲的VB silverlight應用程序。我一直在嘗試獲取單張卡片(我以編程方式創建了Silverlight「Image」控件,並將它們封裝在自己的「CardImage」類中),以便在蒙上陰影時移動。我希望它們在鼠標移到它們上面時彈出,然後在鼠標離開時放下。silverlight中的無效跨線程異常

本質上,我將鼠標移動上的Image.Margin.Top上移5個像素,並在mouseleave事件上下移5個像素。

我一直在遇到有關無效跨線程訪問的可怕「未處理異常」,並且完成了我的作業,我已經瞭解了UI線程與工作線程等,並試圖將整個「begininvoke 「在練習中變得更安全。

以下是問題:異常仍在發生。

這裏是我的代碼:

Public Class CardImage 

Public Disp As Dispatcher = Deployment.Current.Dispatcher 
Public WithEvents Image As New Image 

Private Sub MouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Image.MouseEnter 
    Try 
     Invoke(Sub() Image.Margin = New Thickness(Image.Margin.Left, Image.Margin.Top - 5, 0, 0)) 
    Catch ex As Exception 

    End Try 
End Sub 
Private Sub MouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Image.MouseLeave 
    Try 
     Invoke(Sub() Image.Margin = New Thickness(Image.Margin.Left, Image.Margin.Top + 5, 0, 0)) 
    Catch ex As Exception 

    End Try 
End Sub 

Private Sub Invoke(ByVal act As Action) 
    If Disp.CheckAccess Then 
     act.Invoke() 
    Else 
     Disp.BeginInvoke(act) 
    End If 
End Sub 
End Class 

當我(跨爲13卡的「手」)非常快速移動鼠標在所有所顯示的卡的異常被拋出。請記住,玩家可能最終會做這樣的事情...我真的不希望應用程序崩潰,因爲有些ADHD用戶決定他們希望卡片一遍又一遍地漣漪波動,同時不耐煩地等待其他人玩牌。

任何暗示,爲什麼我的UI線程仍然沒有更新圖像邊距線程?

+0

FYI:我 – 2012-03-19 18:27:05

+0

好吧,我想我的回答是錯誤的,因爲你的方法來自事件處理程序,所以我認爲它們已經在UI線程上了,這就是錯誤仍然發生的原因你是否在另一個線程上編程創建CardImage實例? – Kratz 2012-03-19 18:44:15

+0

@Kratz由於Silverlight主頁上的按鈕點擊事件觸發了卡圖片的創建。按鈕(這只是一個「處理」新測試手的按鈕)創建了所有的CardImage對象,並安排它們。所以你會認爲這將全部在UI線程上。 – 2012-03-19 18:47:07

回答

0

'圖像'是在創建CardImage的線程的上下文中創建的。如果這不是UI線程,但工作線程,你不能從UI線程訪問它(到你分派的鼠標事件

在UI線程創建它:

Public WithEvents Image As Image 

Public Sub New() 

    Image = Invoke(Function() 
         return New Image 
        End Function) 

End Sub 

Private Function Invoke(ByVal procedure As Func(of System.Windows.Controls)) 

    If Disp.CheckAccess Then 
     return procedure.Invoke() 
    Else 
     return Disp.Invoke(procedure) 
    End If 

End Function