Tôi đã tìm thấy a fun program cho phép bạn overlay snowflakes over your desktop and windows. Là một thách thức lập trình, tôi quan tâm đến việc cố gắng tìm ra cách tự làm điều này. Chưa kể rằng chương trình này là một chút của một bộ nhớ hog (nếu nó không có rò rỉ bộ nhớ). Dưới đây là sự khởi đầu tôi có. Tôi đang cố gắng để có được những điều cơ bản xuống với một hình ảnh và sau đó sẽ mở rộng.Di chuyển phần tử như vảy tuyết rơi
Điều tôi thực sự muốn trợ giúp là làm cho hình ảnh di chuyển trơn tru và tự nhiên hơn.
Edit:
tôi đăng một giải pháp xuống dưới trong phần câu trả lời nhưng nó là nhiều CPU chuyên sâu hơn tôi muốn, bất kỳ suy nghĩ? đang
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>
VB Code:
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 Class:
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
Không chắc tại sao điều này đã đóng cửa, nó có vẻ như một câu hỏi thực sự với tôi. Anser của tôi sẽ là: Vì bạn đang cố gắng thực hiện một hoạt ảnh trên mỗi khung hình trong WPF, bạn nên sử dụng sự kiện CompositionTarget.Redering thay vì đồng hồ của riêng bạn. Trên sự kiện kết xuất, bạn có thể gọi mã "vẽ" của mình, để chuyển hình ảnh xung quanh. Bạn có thể muốn sử dụng canvas thay vì lưới làm phần tử máy chủ –