我有一个VB silverlight应用程序,它将成为纸牌游戏。我一直在尝试获取单个卡片(我以编程方式创建,作为Silverlight“图像”控件,包装在他们自己的“CardImage”类中)以便在鼠标移动时移动。我希望它们在鼠标悬停时“弹出”,然后在鼠标离开时向下拉。
基本上,我正在将Image.Margin.Top移动到mouseenter上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 :(得分:0)
'Image'是在创建CardImage的线程的上下文中创建的。如果那不是UI-Thread而是工作线程,则无法从UI-Thread(到您调度鼠标事件的位置)访问它。
在UI-Thread中创建它:
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