【发布时间】:2015-12-23 03:43:04
【问题描述】:
在我的循环中,我的屏幕没有填充最后 3 个MediaElements。如果我扩大或缩小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();
}
}
}
【问题讨论】:
-
听起来您的 3 个动画无法加载。我会确保他们在那里使用逐步调试。然后我会检查你的屏幕是否足够宽以适合所有人
-
先试过了。我的动画数组是 20 个元素,只显示了 17 个。将其设置为 30 以查看 13 是否不会显示。不,只有最后 3 个。屏幕是滚动查看器中的垂直自动调整大小的画布,因此它具有媒体元素的空间,但最后三个不执行双重动画。不过,谢谢您的意见。
-
我认为这与我在嵌套 MediaOpened 操作下的自动激活有关,该操作会增加位置变量。但是当我设置调试时,它会通过最后三个元素适当地递增。
-
GifBrowserCmd是什么? -
另外,你应该使用
mygif.Length而不是.Count()