我想做一个小小的测试,如何绘制"明星"进入WPF-C#-Application中名为image1的Imagebox。有一个计时器,当它过去时调用函数来创建和绘制星球。整个方法可能有点谦虚,因为我对数学非常不好,对于那些更好的人来说似乎有点深奥。问题在于,当我创建一个新星星时,新星的新坐标,它完美地打印出一个新的图像。 (注释掉DrawTimer_Elapsed中的!starList.Any()子句和updateStars()调用 - 所以只留下了createStarSet(),但是当执行updateStars时,星星的X和Y值似乎增加了(因为它们应该和与他们一起,我希望绘图点)但图片保持不变,即使它应该由draw()更新。希望它至少是可以理解的
非常感谢
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
using System.Windows.Media;
using System.Drawing;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DrawTimer.Interval = 100;
DrawTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.DrawTimer_Elapsed);
DrawTimer.Enabled = true;
}
public System.Timers.Timer DrawTimer = new System.Timers.Timer();
public Random rndGen = new Random();
public bool drawable = true;
public void DrawTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DrawTimer.Stop();
if (!starList.Any())
{
image1.Dispatcher.Invoke(new Action(() => this.createStarSet()), System.Windows.Threading.DispatcherPriority.Background);
}
else
{
image1.Dispatcher.Invoke(new Action(() => this.updateStars()), System.Windows.Threading.DispatcherPriority.Background);
}
image1.Dispatcher.Invoke(new Action(() => this.draw()), System.Windows.Threading.DispatcherPriority.Background);
DrawTimer.Start();
}
public void updateStars()
{
foreach (Star myStar in starList)
{
myStar._X += 1;
myStar._Y += 1;
}
}
private void canvas1_Loaded(object sender, RoutedEventArgs e)
{
DrawTimer.Enabled = true;
}
public List<Star> starList = new List<Star>();
public const int MAX_STARS = 100;
public void draw()
{
drawable = false;
GeometryGroup allMyStars = new GeometryGroup();
foreach (Star myStar in starList)
{
allMyStars.Children.Add(new EllipseGeometry(new Point(myStar._X, myStar._Y), 2, 2));
}
GeometryDrawing drawing = new GeometryDrawing();
drawing.Geometry = allMyStars;
drawing.Pen = new Pen(Brushes.Black, 2);
DrawingImage finishedImage = new DrawingImage();
finishedImage.Drawing = drawing;
image1.Source = finishedImage;
image1.Stretch = Stretch.None;
drawable = true;
}
public void createStarSet()
{
starList = new List<Star>();
for (int i = 0; i < MAX_STARS; i++)
{
starList.Add(new Star(rndGen,this));
}
}
public class Star
{
public int _X = 0;
public int _Y = 0;
public double _Speed = 0.0f;
public Star(Random rndGen, Window wdw)
{
_X = rndGen.Next(-(int)Math.Floor((wdw.Width / 8)), (int)Math.Floor((wdw.Width / 8)));
_Y = rndGen.Next(-(int)Math.Floor((wdw.Height / 8)), (int)Math.Floor((wdw.Height / 8)));
_Speed = rndGen.Next(1, 100) / 100;
}
}
}
}
XAML
<Window x:Name="asca" x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="399.875" Width="806" MouseMove="asca_MouseMove">
<Image x:Name="image1" Margin="0"/>
</Window>
答案 0 :(得分:1)
好的..这个是一个棘手的问题,让我待了大约一个小时。您的代码存在的问题是,您始终将所有星星移动到同一个步骤,因此相对位置&#34;他们之间是一样的。我从未与GeometryGroup
和GeometryDrawing
合作过,但它似乎会自动调整图片的大小并将其全部集中在一起,这就是为什么你觉得没有任何东西在移动。
我认为你有一些选择。一个是绘制你自己的位图,你可以设置你的星星的绝对位置(我认为这将工作正常)。其他可能正在使用wpf动画。
无论如何,如果你为每个星指定一个不同的方向,你的代码就可以工作,从而改变它们之间的相对位置,如:
星级
public class Star
{
public int _X = 0;
public int _Y = 0;
public double _Speed = 0.0f;
public int _Direction;
public Star(int x, int y, double speed)
{
_X = x;
_Y = y;
_Speed = speed;
}
public Star(Random rndGen, Window wdw)
{
_X = rndGen.Next(-(int)Math.Floor((wdw.Width / 8)), (int)Math.Floor((wdw.Width / 8)));
_Y = rndGen.Next(-(int)Math.Floor((wdw.Height / 8)), (int)Math.Floor((wdw.Height / 8)));
_Speed = rndGen.Next(1, 100) / 100;
_Direction = rndGen.Next(0, 4);
}
}
UpdateStars方法
public void updateStars()
{
foreach (Star myStar in starList)
{
switch (myStar._Direction)
{
case 1:
myStar._X += 1;
break;
case 2:
myStar._Y += 1;
break;
case 3:
myStar._X -= 1;
break;
case 4:
myStar._Y -= 1;
break;
}
}
}
你可以通过这种方式看到你真正看到&#34;明星&#34;移动。希望这有帮助