Я пытаюсь сделать несколько снимков, сделанных славными слайдами, которые я видел во многих приложениях Microsoft. Тот, где движение начинается медленно, ускоряется на полпути, а затем приходит к хорошей медленной остановке в новом месте. У меня есть все расчеты, выяснение, получение и настройка местоположений окна изображения, подтверждение с помощью console.writeline
, что расположение изображений правильное и даже пробный прогон, который работает в упрощенном формате.Изменение местоположения фотокамер 20 раз в секунду, а не перерисовка
Но в полномасштабной версии оно не перекраивает изображение. На самом деле, похоже, что ничего не произошло во время работы скрипта. Я пробовал Me.Refresh()
, Invalidate()
, Timer.Enabled = True/False
и Me.Update()
. Ни один из них не сработал. Последний шаг - самое неприятное: я вызываю мой метод SetPanelLocation()
в конце, чтобы убедиться, что панель попадает в конечное местоположение независимо от того, работает ли движение. Ничего не происходит и в этом вызове, хотя сразу после этой процедуры вы можете вызвать тот же метод из другого пользовательского события, и он снова начнет работать, как будто ничего не случилось.
Я создаю свой собственный класс PictureBox с именем clsFeedImageBox
, который наследует PictureBox
, который включает эту функциональность (наряду с другими функциями). Каждое изображение составляет всего 300x225 пикселей, поэтому они не являются массивными изображениями, которые занимают много времени, чтобы перерисовать. Каждый экземпляр этого класса находится в общем Forms.SplitterPanel
. Я использую много комментариев по привычке, поэтому я оставил их здесь, возможно, они добавят немного света.
Public Class clsFeedImgBox
Inherits PictureBox
Private iRank As Integer 'rank in whatever feed this file gets put in
Private iRankTarget As Integer 'rank to move to when rank feed event starts
Private iTopStart As Integer 'starting top location before feed event
Private iTopTarget As Integer 'final Top location after feed event
Private WithEvents tMyTimer As New System.Timers.Timer
Private WithEvents oParent As FeedBase 'splitter panel, all location info comes from the parent
Public Sub New(ByRef sender As FeedBase, ByVal rank as Integer)
'set objects
oParent = sender
'set .Image property to pre-made thumbnail
Image.FromFile(ThumbPath) 'ThumbPath is a property which is set by this point (some code has been removed)
'setup initial position
setPanelLocation(rank)
'set autosize
Me.SizeMode = PictureBoxSizeMode.StretchImage
'set Image Scroll timer interval to 20 fps (1000/20 = 50)
tMyTimer.Interval = 50
End Sub
Public Sub scroll(ByVal newRank As Integer)
'setPanelLocation(newRank) <== this works, timed movements don't
iRankTarget = newRank
iTopStart = Me.Top
iTopTarget = oParent.ImgTop(newRank) 'gets an integer for the new Top location
tMyTimer.Start()
End Sub
Private Sub myScrollStep() Handles tMyTimer.Elapsed
'tMyTimer.Enabled = False 'this idea with the enabled = True at the end didn't work
iTickCount += 1
Dim iScrollPerc As Integer 'scroll % between Start and End * 100
iScrollPerc = oParent.ScrollStep(iTickCount, Rank) 'this part works
Console.WriteLine(strThumbName & " scrollPerc: " & iScrollPerc.ToString)
If iScrollPerc >= 100 Then
'scroll event complete
Console.WriteLine(strThumbName & " SetFinalLocation")
Me.setPanelLocation(iRankTarget) '<== This line doesn't work here, but works when called by other means
'stop Feed updates
tMyTimer.Stop()
'reset iTickCount for next movement
iTickCount = 0
Else
'scrolling still going
Dim newTop As Integer
newTop = Math.Round(iTopTarget - (((100 - iScrollPerc) * (iTopTarget - iTopStart))/100)) 'this part works
'Console.WriteLine(strThumbName & " TopTarget: " & newTop)
Me.Top = newTop 'Nothing happens here
End If
'Me.Left = oParent.ImgLeft
'Me.Width = oParent.ImgWidth
'Me.Height = oParent.ImgHeight 'that didn't work
'Me.Refresh() 'this didn't work
'Invalidate() 'this didn't do much good either
'Me.Update() 'Aaaaand no cigar, time for StackOverflow
'tMyTimer.Enabled = True
End Sub
Public Sub setPanelLocation(ByVal rank As Integer)
iRank = rank
Me.MyRePaint()
End Sub
Public Sub MyRePaint()
'repaint image box with everything in it's current rank
Me.Left = oParent.ImgLeft
Me.Top = oParent.ImgTop(iRank)
Me.Width = oParent.ImgWidth
Me.Height = oParent.ImgHeight
End Sub
End Class
Что дает? Должны быть некоторые внутренние работы VB.NET, которые помогут мне понять это. Я использую VS 2012 и Win8