using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using System.Windows;<br />using System.Windows.Controls;<br />using System.Windows.Data;<br />using System.Windows.Documents;<br />using System.Windows.Input;<br />using System.Windows.Media;<br />using System.Windows.Media.Imaging;<br />using System.Windows.Navigation;<br />using System.Windows.Shapes;<br />using System.Threading;<br />using System.Windows.Threading;<br />using DownBox2;<br />namespace Snow1<br />{<br /> /// <summary><br /> /// MainWindow.xaml 的互動邏輯<br /> /// </summary><br /> public partial class MainWindow : Window<br /> {<br /> private const Double Speed = 0.1;<br /> Image i = new Image();<br /> private List<Image> Snowflake;<br /> private List<Image> ReSnowflake;<br /> private Boolean[] IsBottom;<br /> private const int SnowflakeLen = 48, ReSnowflakeLen = 24;<br /> private const int SnowflakeWidth = 10;<br /> private Random random;<br /> private List<int> SnowflakeY;<br /> private ThreadStart ts;<br /> private Thread td;<br /> private DownBox db;<br /> public MainWindow()<br /> {<br /> InitializeComponent();<br /> random = new Random();<br /> Init(@"Image/x3.png",@"Image/x4.png");<br /> ts = new ThreadStart(ThreadFun);<br /> td = new Thread(ts);<br /> RenderOptions.SetBitmapScalingMode(i, BitmapScalingMode.LowQuality);<br /> CompositionTarget.Rendering += new EventHandler(Timer_Tick);<br /> td.Start();<br /> }<br /> private void Init(String uri1,String uri2)<br /> {<br /> int CanWidth = (int)g.Width,pos;<br /> Image sf;<br /> BitmapImage x1, x2;<br /> x1 = new BitmapImage(new Uri(uri1, UriKind.Relative));<br /> x2 = new BitmapImage(new Uri(uri2, UriKind.Relative));<br /> Snowflake=new List<Image>();<br /> ReSnowflake = new List<Image>();<br /> IsBottom = new Boolean[SnowflakeLen];<br /> SnowflakeY = new List<int>();<br /> for (int i = 0; i < SnowflakeLen/2; i++)<br /> {<br /> pos = random.Next(0,400);<br /> SnowflakeY.Add(GetEnd(pos));<br /> sf = new Image();<br /> sf.Source = x1;<br /> sf.Width = 10;<br /> sf.Height = 10;<br /> Canvas.SetLeft(sf,pos);<br /> Canvas.SetTop(sf, GetPosY(pos));<br /> g.Children.Add(sf);<br /> Snowflake.Add(sf);<br /> }<br /> for (int i = SnowflakeLen / 2; i < SnowflakeLen ; i++)<br /> {<br /> pos = random.Next(0,400);<br /> SnowflakeY.Add(GetEnd(pos));<br /> sf = new Image();<br /> sf.Source = x2;<br /> sf.Width = 10;<br /> sf.Height = 10;<br /> Canvas.SetLeft(sf,pos);<br /> Canvas.SetTop(sf, GetPosY(pos));<br /> g.Children.Add(sf);<br /> Snowflake.Add(sf);<br /> }<br /> for (int i = 0; i < ReSnowflakeLen; i++)<br /> {<br /> sf = new Image();<br /> sf.Source = x2;<br /> sf.Width = 10;<br /> sf.Height = 10;<br /> Canvas.SetLeft(sf, -10);<br /> Canvas.SetTop(sf, -10);<br /> g.Children.Add(sf);<br /> ReSnowflake.Add(sf);<br /> }<br /> }<br /> private int GetEnd(int x)<br /> {<br /> int z = 0, y = 0;<br /> int BD;<br /> if (x <= 140)<br /> {<br /> z = (int)(0.3571 * x + 143);<br /> y = z;<br /> }<br /> else if (140 <= x && x <= 230)<br /> {<br /> z = (int)(0.4743 * x + 126);<br /> BD = (int)(0.1423 * x + 167);<br /> y = random.Next(BD,z);<br /> }<br /> else<br /> {<br /> z = 230;<br /> BD = (int)(0.1423 * x + 167);<br /> y = random.Next(BD,z);<br /> }<br /> return y;<br /> }<br /> private int GetPosY(int x)<br /> {<br /> int z = 0, y = 0;<br /> int BD;<br /> if (x <= 140)<br /> {<br /> z = (int)(0.3571 * x + 143);<br /> y = random.Next(z);<br /> }<br /> else if (140 <= x && x <= 230)<br /> {<br /> z = (int)(0.4743 * x + 126);<br /> BD = (int)(0.1423 * x + 167);<br /> y = random.Next(z );</p><p> }<br /> else<br /> {<br /> z = 230;<br /> BD = (int)(0.1423 * x + 167);<br /> y = random.Next(z );<br /> }<br /> return y;</p><p> }<br /> private void ThreadFun()<br /> {<br /> int pos;<br /> int SleepTime=1500;<br /> while (true)<br /> {<br /> if (Snowflake.Count > 60)<br /> {<br /> SleepTime = 2000;<br /> }<br /> else if (Snowflake.Count < 50)<br /> {<br /> SleepTime = 1500;<br /> }<br /> else if (Snowflake.Count < 45)<br /> {<br /> SleepTime = 1200;<br /> }<br /> else if (Snowflake.Count<35)<br /> {<br /> SleepTime = 900;<br /> }<br /> for (int i = 0; i < ReSnowflake.Count; i++)<br /> {<br /> Thread.Sleep(random.Next(SleepTime));<br /> this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate<br /> {<br /> textBlock4.Text = SleepTime.ToString();<br /> pos = random.Next(0, 400);<br /> Canvas.SetLeft(ReSnowflake[i], pos);<br /> Snowflake.Add(ReSnowflake[i]);<br /> SnowflakeY.Add(GetEnd(pos));<br /> ReSnowflake.RemoveAt(i);<br /> });<br /> }<br /> }</p><p> }<br /> private void Timer_Tick(object sender, EventArgs e)<br /> {<br /> Double top;<br /> for (int i = 0; i < Snowflake.Count;i++)<br /> {<br /> textBlock1.Text = Snowflake.Count.ToString();<br /> top = Canvas.GetTop(Snowflake[i]);<br /> if (top >= SnowflakeY[i])<br /> {<br /> Canvas.SetTop(Snowflake[i], -10);<br /> ReSnowflake.Add(Snowflake[i]);<br /> Snowflake.RemoveAt(i);<br /> SnowflakeY.RemoveAt(i);<br /> }<br /> else<br /> {<br /> Canvas.SetTop(Snowflake[i], top+Speed);<br /> }<br /> }<br /> }<br /> private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)<br /> {<br /> td.Abort();<br /> }</p><p> }<br />}<br />
完整代碼