WPF不屑于gif的简单动画!
但是这对程序员来说不大爽啊!急得我眼泪都下来了!
幸好WPF里有MediaElement这个东西,它是对MediaPlyer的一个封装,果然很强大啊。不过另我不爽的是我这里有N个gif图片就要有N个MediaElement,要了亲命了。
还是不好,如果你能想到用WebBrowseControl来实现,或者用Frame来实现,恭喜你,你太有才了!
我还是不想这么去做,才分不够啊!
重写一下WPF的image,good idea!
public class GIFImageControl : System.Windows.Controls.Image
{
delegate void OnFrameChangedDelegate()
private Bitmap m_Bitmap
public string Path { getset}
BitmapSource bitmapSource
public void AnimatedImageControl(string path)
{
Path = path
m_Bitmap = (Bitmap)Image.FromFile(path)
Width = m_Bitmap.Width
Height = m_Bitmap.Height
ImageAnimator.Animate(m_Bitmap, OnFrameChanged)
bitmapSource = GetBitmapSource()
Source = bitmapSource
}
private void OnFrameChanged(object sender, EventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new OnFrameChangedDelegate(OnFrameChangedInMainThread))
}
private void OnFrameChangedInMainThread()
{
ImageAnimator.UpdateFrames()
if (bitmapSource != null)
bitmapSource.Freeze()
bitmapSource = GetBitmapSource()
Source = bitmapSource
InvalidateVisual()
}
//private static bool loaded
private BitmapSource GetBitmapSource()
{
IntPtr inptr = m_Bitmap.GetHbitmap()
bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(
inptr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
DeleteObject(inptr)
return bitmapSource
}
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr o)
}
ok,用window原有的东西去绑定到wpf上去。很好吧!是不是也比较有才呢?
来自: http://hi.baidu.com/mych/blog/item/1eb14f545f12a752564e00be.html
可以使用BeginAnimation( )方法同时加载多个动画。BeginAnimation( )方法几乎总是立即返回,从而可以使用类似下面的代码同时为两个属性应用动画:DoubleAnimation widthAnimation = new DoubleAnimation()
widthAnimation.From = 160
widthAnimation.To = this.Width - 30
widthAnimation.Duration = TimeSpan.FromSeconds(5)
DoubleAnimation heightAnimation = new DoubleAnimation()
heightAnimation.From = 40
heightAnimation.To = this.Height - 50
heightAnimation.Duration = TimeSpan.FromSeconds(5)
cmdGrow.BeginAnimation(Button.WidthProperty, widthAnimation)
cmdGrow.BeginAnimation(Button.HeightProperty, heightAnimation)
在这个示例中,两个动画没有被同步。这意味着宽度和高度不会准确地在相同的时间间隔内增长(通常,将会看到按钮先增加宽度紧接着增加高度)。可以通过创建绑定到同一个时间线的动画,突破这一限制。
<灌水><a herf="http://blog.csdn.net/gqqnb/article/details/7213449">您可以看下这篇博文</a>
</灌水>
<灌水>第三种方法一定会占用很大资源</灌水>
<灌水>
<a herf="https://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.bitmapsource(v=vs.110).aspx#示例">
本篇来自MSDN的文档阐述了以BitmapImage方式的实现</a>
<a herf="https://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.bitmapimage(v=vs.110).aspx">
另请参见https://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.bitmapimage(v=vs.110).aspx</a>
</灌水>
我水不下去了
另外,您为什么需要用WPF加入那么多GIF呢,毕竟IL代码做的优化已经让性能提高了,继续(挣扎)是没有很大用的。
WPF的资源占用问题很严重,其实不适合做高性能程序(参见C++与C#的性能差别)
反正我也不是要超想要采纳
就这样
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)