像飘落的雪花一样移动元素

vol*_*Art 8 vb.net wpf

我发现了一个有趣的程序,允许您在桌面和窗口叠加雪花.作为编程挑战,我有兴趣试图弄清楚如何自己做这件事.更不用说这个程序有点内存耗费(如果它没有内存泄漏).以下是我的开始.我试图通过一个图像得到基础,然后将扩展.

我真正想要帮助的是让图像更加平滑自然地移动.


编辑:

我在答案部分下面发布了一个解决方案,但它比我想要的CPU密集度更高,有什么想法吗?


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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

片状类:

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
Run Code Online (Sandbox Code Playgroud)

Rhy*_*ous 1

为什么要自己移动它而不是使用动画?

如果您使用 WPF 的动画(这在 Expression Blend 中非常容易实现),我认为您将获得您正在寻找的平滑度,并且您可以获得一些运动变化,使其更加真实。

WPF 表达式混合视频

基础动画