MediaElement动画激活循环不会触发最后3个动画

在我的循环中,我的屏幕不会填充最后3个MediaElement 。 如果我扩展或缩小MediaElement数组….

 MediaElement[] mygif = new MediaElement[30]; 

从30个元素到40个元素,它将显示37个元素。

以下是此方法的完整源代码,如果您注意到第一个媒体元素被隐藏,则这是故意的。

 private void LoadGifScreen() { Window GifBrowserCmd = new Window(); GifBrowserCmd.ShowInTaskbar = false; GifBrowserCmd.Width = 200; GifBrowserCmd.Height = screenHeight * .8; GifBrowserCmd.Left = screenWidth - GifBrowserCmd.Width; GifBrowserCmd.Top = screenHeight*.1; GifBrowserCmd.WindowStyle = System.Windows.WindowStyle.None; GifBrowserCmd.ResizeMode = System.Windows.ResizeMode.NoResize; GifBrowserCmd.Background = BaseColor; GifBrowserCmd.AllowsTransparency = true; GifBrowserCmd.Opacity = toolOpacity; MediaElement[] mygif = new MediaElement[30]; gborder = new Border[30]; GifCanvas = new Canvas(); int brdr_height = 150; GifCanvas.Height = brdr_height * mygif.Count(); GifList = new Dictionary(); DoubleAnimation[] anim2 = new DoubleAnimation[30]; bool[] animsact = new bool[30]; for (int i = 0; i  { MediaElement tmp = (MediaElement)o; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; } mygif[tmpkey].Position = new TimeSpan(0, 0, 1); mygif[tmpkey].Play(); }; mygif[i].PreviewMouseLeftButtonDown += (o, m) => { MediaElement tmp = (MediaElement)o; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; LoadGifDetailScreen(tmpkey); } else { MessageBox.Show("Couldn't find gif in Dictionary!"); } }; gborder[i].BorderBrush = Brushes.White; gborder[i].BorderThickness = new Thickness(3, 3, 3, 3); gborder[i].CornerRadius = new CornerRadius(8, 8, 8, 8); gborder[i].Child = mygif[i]; gborder[i].Width = 200; gborder[i].Height = brdr_height; GifCanvas.Children.Add(gborder[i]); Canvas.SetTop(gborder[i], (i * gborder[i].Height) + (bigspacer * i) - gborder[i].Height); Canvas.SetLeft(gborder[i], gborder[i].Width); gborder[i].Visibility = System.Windows.Visibility.Hidden; mygif[i].MediaOpened += (l,p) => { MediaElement tmp = (MediaElement)l; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; tmpkey--; } TranslateTransform trans = new TranslateTransform(); gborder[tmpkey].RenderTransform = trans; anim2[tmpkey] = new DoubleAnimation(gborder[tmpkey].Width, 0 - gborder[tmpkey].Width, TimeSpan.FromSeconds(.25)); anim2[tmpkey].Completed += (s, e) => { if (position <= mygif.Count()) { gborder[position].Visibility = System.Windows.Visibility.Visible; trans.BeginAnimation(TranslateTransform.XProperty, anim2[position]); position++; } }; if (tmpkey == 0) { gborder[(tmpkey)].Visibility = System.Windows.Visibility.Visible; trans.BeginAnimation(TranslateTransform.XProperty, anim2[(tmpkey)]); position++; } }; } ScrollViewer sv1 = new ScrollViewer(); sv1.CanContentScroll = true; sv1.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; sv1.Height = GifBrowserCmd.Height; sv1.Content = GifCanvas; GifBrowserGrid.Children.Add(sv1); GifBrowserCmd.Content = GifBrowserGrid; GifBrowserCmd.Show(); GifBrowserCmd.Deactivated += GifListCmd_Deactivated; } 

如何激活整个MediaElement数组的动画?

UPDATE

从Netscapes添加代码回答。

 using System; using System.Collections.Generic; using System.Linq; using System.Net; 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.Interop; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Media.Animation; using System.Windows.Navigation; using System.Windows.Shapes; using System.Runtime.InteropServices; using System.IO; namespace WpfApplication4 { ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { int spacer = 2; int bigspacer; double toolOpacity = 1; double windowWidth = 50; double windowHeight = 50; double totalwidth; double centerApp; double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight; List mygif; List gborder; List anim2; List animsact; Dictionary GifList = new Dictionary(); int _pos = 0; Canvas GifCanvas; Grid GifBrowserGrid = new Grid(); private int position { get { return _pos; } set { _pos = value; //Console.WriteLine(_pos); } } public MainWindow() { InitializeComponent(); Window GifBrowserCmd = new Window(); GifBrowserCmd.ShowInTaskbar = false; GifBrowserCmd.Width = 200; GifBrowserCmd.Height = screenHeight * .8; GifBrowserCmd.Left = screenWidth - GifBrowserCmd.Width; GifBrowserCmd.Top = screenHeight * .1; GifBrowserCmd.WindowStyle = System.Windows.WindowStyle.None; GifBrowserCmd.ResizeMode = System.Windows.ResizeMode.NoResize; GifBrowserCmd.Background = Brushes.Black; GifBrowserCmd.AllowsTransparency = true; GifBrowserCmd.Opacity = toolOpacity; GifCanvas = new Canvas(); GifList = new Dictionary(); string[] filesArray = Directory.GetFiles("D:\\Images\\Animated Images\\"); mygif = Enumerable.Range(0, 20).Select(d => new MediaElement()).ToList(); gborder = Enumerable.Range(0, 30).Select(d => new Border()).ToList(); anim2 = Enumerable.Range(0, 30).Select(d => new DoubleAnimation()).ToList(); animsact = Enumerable.Range(0, 30).Select(d => false).ToList(); GifCanvas = new Canvas(); int brdr_height = 150; GifCanvas.Height = brdr_height * mygif.Count(); for (int i = 0; i  x.Value == searchstring).Key; tmpkey--; } TranslateTransform trans = new TranslateTransform(); gborder[tmpkey].RenderTransform = trans; anim2[tmpkey] = new DoubleAnimation(gborder[tmpkey].Width, 0 - gborder[tmpkey].Width, TimeSpan.FromSeconds(.25)); anim2[tmpkey].Completed += AnimationCompleted; if (tmpkey == 0) { gborder[(tmpkey)].Visibility = System.Windows.Visibility.Visible; trans.BeginAnimation(TranslateTransform.XProperty, anim2[(tmpkey)]); position++; } } private void AnimationCompleted(object sender, EventArgs e) { if (position  x.Value == searchstring).Key; //LoadGifDetailScreen(tmpkey); } else { MessageBox.Show("Couldn't find gif in Dictionary!"); } } private void MediaEndedHandler(object sender, RoutedEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; } mygif[tmpkey].Position = new TimeSpan(0, 0, 1); mygif[tmpkey].Play(); } } } 

我怀疑它可能是position增加的东西以及你生成tmpkey 。 我还建议不要将lambdas用于事件处理程序,而使用本地方法可能是更安全的路径。

显示控件后,使用Snoop检查控件并确定是否所有30个控件实际上都已添加到UI中。 如果它们是,那么在控件重叠的情况下你的代码出了问题就是你没有正确设置可见性(这就是为什么我注释掉下面的一行,用于调试)。

这是一条让我挑眉的线条:

 tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; tmpkey--; 

如果这在你的第一个元素上运行,字典键= 0,则tmpkey--将为-1 。 如果它在你的最后一个元素上运行,则tmpkey将为28并且永远不会等于29 ,因此使用tmpkey访问您的数组,因为索引不会获得分配的属性。 相关 – LoadGifDetailScreen发生了LoadGifDetailScreen

我创建了一个带有setter的属性,该setter设置position并在每次设置时打印出值。 观察您的输出窗口,看看您是否注意到任何有趣的增量。 我还修改了代码,使其读起来更清晰(我将编辑问题以删除优化标记)。

码:

 List mygif; List gborder; List anim2; List animsact; Dictionary GifList = new Dictionary(); int _pos = 0; private int position { get { return _pos; } set { _pos = value; Console.WriteLine(_pos); } } public MainWindow() { InitializeComponent(); mygif = Enumerable.Range(0, 30).Select(d => new MediaElement()).ToList(); gborder = Enumerable.Range(0, 30).Select(d => new Border()).ToList(); anim2 = Enumerable.Range(0, 30).Select(d => new DoubleAnimation()).ToList(); animsact = Enumerable.Range(0, 30).Select(d => false).ToList(); GifCanvas = new Canvas(); int brdr_height = 150; GifCanvas.Height = brdr_height * mygif.Count; for(int i = 0; i < mygif.Count; i++) { //Setup MediaElement mygif[i].UnloadedBehavior = MediaState.Play; mygif[i].LoadedBehavior = MediaState.Manual; mygif[i].MediaEnded += MediaEndedHandler; mygif[i].PreviewMouseLeftButtonDown += PreviewMouseLeftButtonDownHandler; mygif[i].MediaOpened += MainWindow_MediaOpened; //Setup Border gborder[i].BorderBrush = Brushes.White; gborder[i].BorderThickness = new Thickness(3, 3, 3, 3); gborder[i].CornerRadius = new CornerRadius(8, 8, 8, 8); gborder[i].Child = mygif[i]; gborder[i].Width = 200; gborder[i].Height = brdr_height; GifCanvas.Children.Add(gborder[i]); Canvas.SetTop(gborder[i], (i * gborder[i].Height) + (bigspacer * i) - gborder[i].Height); Canvas.SetLeft(gborder[i], gborder[i].Width); //Comment the below line out to see if shows them all has an effect //gborder[i].Visibility = System.Windows.Visibility.Hidden; } ScrollViewer sv1 = new ScrollViewer(); sv1.CanContentScroll = true; sv1.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; sv1.Height = GifBrowserCmd.Height; sv1.Content = GifCanvas; GifBrowserGrid.Children.Add(sv1); GifBrowserCmd.Content = GifBrowserGrid; GifBrowserCmd.Show(); GifBrowserCmd.Deactivated += GifListCmd_Deactivated; } private void MediaOpened(object sender, RoutedEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if(GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; tmpkey--; } TranslateTransform trans = new TranslateTransform(); gborder[tmpkey].RenderTransform = trans; anim2[tmpkey] = new DoubleAnimation(gborder[tmpkey].Width, 0 - gborder[tmpkey].Width, TimeSpan.FromSeconds(.25)); anim2[tmpkey].Completed += AnimationCompleted; if(tmpkey == 0) { gborder[(tmpkey)].Visibility = System.Windows.Visibility.Visible; trans.BeginAnimation(TranslateTransform.XProperty, anim2[(tmpkey)]); position++; } } private void AnimationCompleted(object sender, EventArgs e) { if(position < mygif.Count) { gborder[position].Visibility = System.Windows.Visibility.Visible; gborder[position].RenderTransform.BeginAnimation(TranslateTransform.XProperty, anim2[position++]); } } private void PreviewMouseLeftButtonDownHandler(object sender, MouseButtonEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if(GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; LoadGifDetailScreen(tmpkey); } else { MessageBox.Show("Couldn't find gif in Dictionary!"); } } private void MediaEndedHandler(object sender, RoutedEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if(GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; } mygif[tmpkey].Position = new TimeSpan(0, 0, 1); mygif[tmpkey].Play(); } 

这是NETscape帮助完成的答案。 我不得不重新安排一些代码,以便它适当地运行。

  int spacer = 2; int bigspacer; double toolOpacity = 1; double windowWidth = 50; double windowHeight = 50; double totalwidth; double centerApp; double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight; List mygif; List gborder; List anim2; List animsact; Dictionary GifList = new Dictionary(); int _pos = 0; Canvas GifCanvas; Grid GifBrowserGrid = new Grid(); private int position { get { return _pos; } set { _pos = value; //Console.WriteLine(_pos); } } public MainWindow() { InitializeComponent(); Window GifBrowserCmd = new Window(); GifBrowserCmd.ShowInTaskbar = false; GifBrowserCmd.Width = 200; GifBrowserCmd.Height = screenHeight * .8; GifBrowserCmd.Left = screenWidth - GifBrowserCmd.Width; GifBrowserCmd.Top = screenHeight * .1; GifBrowserCmd.WindowStyle = System.Windows.WindowStyle.None; GifBrowserCmd.ResizeMode = System.Windows.ResizeMode.NoResize; GifBrowserCmd.Background = Brushes.Black; GifBrowserCmd.AllowsTransparency = true; GifBrowserCmd.Opacity = toolOpacity; GifCanvas = new Canvas(); GifList = new Dictionary(); string[] filesArray = Directory.GetFiles("D:\\Images\\Animated Images\\"); mygif = Enumerable.Range(0, 20).Select(d => new MediaElement()).ToList(); gborder = Enumerable.Range(0, 30).Select(d => new Border()).ToList(); anim2 = Enumerable.Range(0, 30).Select(d => new DoubleAnimation()).ToList(); animsact = Enumerable.Range(0, 30).Select(d => false).ToList(); GifCanvas = new Canvas(); int brdr_height = 150; GifCanvas.Height = brdr_height * mygif.Count(); for (int i = 0; i < mygif.Count(); i++) { GifList.Add(i, filesArray[i]); mygif[i] = new MediaElement(); mygif[i].Source = new Uri(@filesArray[i]); gborder[i] = new Border(); //Setup MediaElement mygif[i].UnloadedBehavior = MediaState.Play; mygif[i].LoadedBehavior = MediaState.Manual; mygif[i].MediaEnded += MediaEndedHandler; mygif[i].PreviewMouseLeftButtonDown += PreviewMouseLeftButtonDownHandler; mygif[i].MediaOpened += MediaOpened; mygif[i].Stretch = Stretch.Uniform; mygif[i].Position = TimeSpan.FromMilliseconds(1); mygif[i].Play(); //Setup Border gborder[i].BorderBrush = Brushes.White; gborder[i].BorderThickness = new Thickness(3, 3, 3, 3); gborder[i].CornerRadius = new CornerRadius(8, 8, 8, 8); gborder[i].Child = mygif[i]; gborder[i].Width = 200; gborder[i].Height = brdr_height; GifCanvas.Children.Add(gborder[i]); Canvas.SetTop(gborder[i], (i * gborder[i].Height) + (bigspacer * i));// - gborder[i].Height); Canvas.SetLeft(gborder[i], gborder[i].Width); //Comment the below line out to see if shows them all has an effect //gborder[i].Visibility = System.Windows.Visibility.Hidden; } ScrollViewer sv1 = new ScrollViewer(); sv1.CanContentScroll = true; sv1.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; sv1.Height = GifBrowserCmd.Height; sv1.Content = GifCanvas; GifBrowserGrid.Children.Add(sv1); GifBrowserCmd.Content = GifBrowserGrid; GifBrowserCmd.Show(); //GifBrowserCmd.Deactivated += GifListCmd_Deactivated; } private void MediaOpened(object sender, RoutedEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; //tmpkey--; } TranslateTransform trans = new TranslateTransform(); gborder[tmpkey].RenderTransform = trans; anim2[tmpkey] = new DoubleAnimation(gborder[tmpkey].Width, 0 - gborder[tmpkey].Width, TimeSpan.FromSeconds(.25)); anim2[tmpkey].Completed += AnimationCompleted; if (tmpkey == 0) { gborder[(tmpkey)].Visibility = System.Windows.Visibility.Visible; trans.BeginAnimation(TranslateTransform.XProperty, anim2[(tmpkey)]); position++; } } private void AnimationCompleted(object sender, EventArgs e) { if (position < mygif.Count()) { try { bool changed = false; if (position == 19) { changed = true; } gborder[position].Visibility = System.Windows.Visibility.Visible; gborder[position].RenderTransform = new TranslateTransform(); gborder[position].RenderTransform.BeginAnimation(TranslateTransform.XProperty, anim2[position++]); } catch (Exception f) { MessageBox.Show(f.InnerException.Data.ToString()); } } } private void PreviewMouseLeftButtonDownHandler(object sender, MouseButtonEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; //LoadGifDetailScreen(tmpkey); } else { MessageBox.Show("Couldn't find gif in Dictionary!"); } } private void MediaEndedHandler(object sender, RoutedEventArgs e) { MediaElement tmp = (MediaElement)sender; int tmpkey = 0; string searchstring = tmp.Source.AbsolutePath.ToString().Replace("%20", " ").Replace("/", @"\").Replace("\\", @"\"); if (GifList.ContainsValue(searchstring)) { tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key; } mygif[tmpkey].Position = new TimeSpan(0, 0, 1); mygif[tmpkey].Play(); }