C#-MediaElement动画激活循环不会触发最后3个动画
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-MediaElement动画激活循环不会触发最后3个动画,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含14251字,纯文字阅读大概需要21分钟。
内容图文
在循环期间,我的屏幕没有填充最后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<int, string>();
DoubleAnimation[] anim2 = new DoubleAnimation[30];
bool[] animsact = new bool[30];
for (int i = 0; i < mygif.Count(); i++)
{
mygif[i] = new MediaElement();
gborder[i] = new Border();
mygif[i].UnloadedBehavior = MediaState.Play;
mygif[i].LoadedBehavior = MediaState.Manual;
mygif[i].Source = new Uri(@filesArray[i]);
GifList.Add(i, filesArray[i]);
mygif[i].Stretch = Stretch.Uniform;
mygif[i].Position = TimeSpan.FromMilliseconds(1);
mygif[i].Play();
mygif[i].MediaEnded += (o, r) =>
{
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数组的动画?
更新
从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
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
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<MediaElement> mygif;
List<Border> gborder;
List<DoubleAnimation> anim2;
List<bool> animsact;
Dictionary<int, string> GifList = new Dictionary<int, string>();
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<int, string>();
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();
}
}
}
解决方法:
我怀疑这可能与位置增加以及生成tmpkey的方式有关.我还建议不要将lambda用于事件处理程序,这可能是使用本地方法的安全途径.
在显示控件之后,使用Snoop检查您的控件并确定是否将所有30个控件实际上添加到了UI中.如果是这样,则在控件重叠的情况下,您的代码出了点问题,您只是没有正确设置可见性(所以这就是为什么我注释掉下面一行用于调试).
这条线让我大吃一惊:
tmpkey = GifList.FirstOrDefault(x => x.Value == searchstring).Key;
tmpkey--;
如果这在您的第一个元素上运行,则字典键= 0,则tmpkey–将为-1.如果它在您的最后一个元素上运行,则tmpkey将为28,并且永远不等于29,因此使用tmpkey来访问您的数组,因为索引不会获得分配的属性.相关-LoadGifDetailScreen中发生了什么吗?
我创建了一个带有设置器的属性,该设置器设置位置并在每次设置时打印出该值.观察输出窗口,看看是否注意到任何有趣的增量.我还修改了代码,使它读起来更简洁(我将编辑问题以删除优化标签).
码:
List<MediaElement> mygif;
List<Border> gborder;
List<DoubleAnimation> anim2;
List<bool> animsact;
Dictionary<int, string> GifList = new Dictionary<int, string>();
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();
}
内容总结
以上是互联网集市为您收集整理的C#-MediaElement动画激活循环不会触发最后3个动画全部内容,希望文章能够帮你解决C#-MediaElement动画激活循环不会触发最后3个动画所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。