Znalazłem a fun program, który pozwala na overlay snowflakes over your desktop and windows. Jako wyzwanie programistyczne jestem zainteresowany próbą samodzielnego rozwiązania tego problemu. Nie wspominając o tym, że ten program jest trochę pamięciowy (jeśli nie ma wycieku pamięci). Poniżej jest początek, który mam. Próbuję zepsuć podstawy jednym obrazem, a następnie rozwinąć.Przenieś element, taki jak spadający płatek śniegu.
To, co naprawdę chciałbym uzyskać, sprawi, że obraz będzie płynniej i bardziej naturalnie.
Edit:
napisałem rozwiązanie w dół poniżej w sekcji odpowiedzi, ale to jest bardziej intensywna niż CPU Chciałbym, wszelkie myśli? Kod
WPF XAML:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
AllowsTransparency="True"
WindowStyle="None"
Title="MainWindow" Height="350" Width="525" Background="Transparent" Topmost="True" WindowState="Maximized" ResizeMode="NoResize">
<Grid Name="grid1">
<Image Height="26" HorizontalAlignment="Left" Margin="{Binding flakeMargin}" Name="Image1" Stretch="Fill" VerticalAlignment="Top" Width="28" Source="/snowTest;component/Images/blue-pin-md.png" />
</Grid>
</Window>
kod VB:
Imports System.ComponentModel
Class MainWindow
Dim bw As BackgroundWorker = New BackgroundWorker
Dim flake0 As New flake
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
grid1.DataContext = flake0
AddHandler bw.DoWork, AddressOf backgroundMover
bw.RunWorkerAsync()
End Sub
Private Sub backgroundMover(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
While (True)
flake0.move()
System.Threading.Thread.Sleep(100)
End While
End Sub
End Class
Flake Klasa:
Imports System.ComponentModel
Public Class flake
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Private Property startLeft As Integer = 300
Private Property left As Integer = left
Private Property top As Integer = 100
Private Property speed As Integer = 1
Public ReadOnly Property flakeMargin As Thickness
Get
Return New Thickness(left, top, 0, 0)
End Get
End Property
Public Sub move()
top += speed
left = (Math.Cos(top - 100)) * 6 + startLeft
NotifyPropertyChanged("flakeMargin")
End Sub
End Class
Nie wiem, dlaczego ten został zamknięty, wydaje się, prawdziwe pytanie do mnie. Mój byłby: Ponieważ próbujesz zrobić animację na klatkę w WPF, powinieneś używać zdarzenia CompositionTarget.Redering zamiast własnego zegara. W zdarzeniu renderowania możesz wywołać swój kod "rysuj", który będzie przesuwał obraz. Prawdopodobnie chcesz użyć płótna zamiast siatki jako elementu hosta. –