using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Media.Imaging; using System.IO; using System.Windows.Controls; using LinePutScript; using static VPet_Simulator.Core.GraphCore; using static VPet_Simulator.Core.Picture; namespace VPet_Simulator.Core { /// /// Picture.xaml 的交互逻辑 /// public class Picture : IImageRun { /// /// 新建新静态图像 /// /// 图片路径 public Picture(GraphCore graphCore, string path, GraphInfo graphinfo, int length = 1000, bool isloop = false) { GraphInfo = graphinfo; IsLoop = isloop; Length = length; GraphCore = graphCore; Path = path; if (!GraphCore.CommConfig.ContainsKey("PIC_Setup")) { GraphCore.CommConfig["PIC_Setup"] = true; GraphCore.CommUIElements["Image1.Picture"] = new Image() { Width = 500, Height = 500 }; GraphCore.CommUIElements["Image2.Picture"] = new Image() { Width = 500, Height = 500 }; } } public static void LoadGraph(GraphCore graph, FileSystemInfo path, ILine info) { if (!(path is FileInfo)) { PNGAnimation.LoadGraph(graph, path, info); return; } int length = info.GetInt("length"); if (length == 0) { if (!int.TryParse(path.Name.Split('.').Reverse().ToArray()[1].Split('_').Last(), out length)) length = 1000; } bool isLoop = info[(gbol)"loop"]; Picture pa = new Picture(graph, path.FullName, new GraphInfo(path, info), length, isLoop); graph.AddGraph(pa); } /// /// 图片资源 /// public string Path; private GraphCore GraphCore; public bool PlayState { get; set; } public bool IsLoop { get; set; } public int Length { get; set; } //public bool StoreMemory => true;//经过测试,储存到内存好处多多,不储存也要占用很多内存,干脆存了吧 public bool IsContinue { get; set; } /// /// 动画信息 /// public GraphInfo GraphInfo { get; private set; } public bool IsReady => true; public void Run(Border parant, Action EndAction = null) { if (PlayState) { IsContinue = true; return; } PlayState = true; DoEndAction = true; parant.Dispatcher.Invoke(() => { if (parant.Tag != this) { Image img; if (parant.Child == GraphCore.CommUIElements["Image1.Picture"]) { img = (Image)GraphCore.CommUIElements["Image1.Picture"]; } else { img = (Image)GraphCore.CommUIElements["Image2.Picture"]; if (parant.Child != img) { if (img.Parent == null) { parant.Child = null; parant.Child = img; } else { img = (Image)GraphCore.CommUIElements["Image1.Picture"]; if (img.Parent != null) ((Decorator)img.Parent).Child = null; parant.Child = img; } } } //var bitmap = new BitmapImage(); //bitmap.BeginInit(); //stream.Seek(0, SeekOrigin.Begin); //bitmap.StreamSource = stream; //bitmap.CacheOption = BitmapCacheOption.OnLoad; //bitmap.EndInit(); img.Width = 500; img.Source = new BitmapImage(new Uri(Path)); parant.Tag = this; } Task.Run(() => { Thread.Sleep(Length); if (IsLoop && PlayState) { Run(parant, EndAction); } else { PlayState = false; if (DoEndAction) EndAction?.Invoke();//运行结束动画时事件 } }); }); } bool DoEndAction = true; public void Stop(bool StopEndAction = false) { PlayState = false; this.DoEndAction = !StopEndAction; } public Task Run(System.Windows.Controls.Image img, Action EndAction = null) { PlayState = true; DoEndAction = true; return img.Dispatcher.Invoke(() => { if (img.Tag == this) { return new Task(() => { Thread.Sleep(Length); if (IsLoop && PlayState) { Run(img, EndAction); } else { PlayState = false; if (DoEndAction) EndAction?.Invoke();//运行结束动画时事件 } }); } img.Tag = this; img.Source = new BitmapImage(new Uri(Path)); img.Width = 500; return new Task(() => { Thread.Sleep(Length); if (IsLoop && PlayState) { Run(img, EndAction); } else { PlayState = false; if (DoEndAction) EndAction?.Invoke();//运行结束动画时事件 } }); }); } public interface IImageRun : IGraph { /// /// 指定图像图像控件准备运行该动画 /// /// 用于显示的Image /// 结束动画 /// 准备好的线程 Task Run(System.Windows.Controls.Image img, Action EndAction = null); } } }