вообще вот такая проблема
пишу wpf приложение. я не нашел компонента, который правильно отображает gif анимацию, поэтому использую PictureBox.
<wfi:WindowsFormsHost Height="93">
<winForms:PictureBox x:Name="pictureBoxLoading">
</winForms:PictureBox>
</wfi:WindowsFormsHost>
в проекте находится папка с изображениями — у все свойства Resources установлены
на относительный путь ругается:
pictureBoxLoading.Image = Bitmap.FromFile("right.gjf"); - FileNotExisted
так вот я не знаю как загрузить pictureBoxLoading.Image, так как нету поддержки конструкции Uri(
pack:///)....
подскажите как загрузить правильно?
Здравствуйте, Аноним, Вы писали:
А>вообще вот такая проблема
А>пишу wpf приложение. я не нашел компонента, который правильно отображает gif анимацию, поэтому использую PictureBox.
А>А><wfi:WindowsFormsHost Height="93">
А> <winForms:PictureBox x:Name="pictureBoxLoading">
А> </winForms:PictureBox>
А></wfi:WindowsFormsHost>
А>
А>в проекте находится папка с изображениями — у все свойства Resources установлены
А>на относительный путь ругается:
А>А> pictureBoxLoading.Image = Bitmap.FromFile("right.gjf"); - FileNotExisted
А>
А>так вот я не знаю как загрузить pictureBoxLoading.Image, так как нету поддержки конструкции Uri(pack:///)....
А>подскажите как загрузить правильно?
Если нужен анимированный gif, то есть такой код, найденный в инете и слегка доработанный напильником (и никаких WinForms, соответственно с "
pack://..." проблем не будет):
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
namespace Images
{
/// <summary>
/// Класс для отображения анимированных GIF-ов.
/// </summary>
public class GifImage : Image
{
GifBitmapDecoder _gf;
Int32Animation _anim;
bool _animationIsWorking = false;
/// <summary>
/// Индес отображаемого кадра GIF-а.
/// </summary>
public int FrameIndex
{
get { return (int) GetValue(FrameIndexProperty); }
set { SetValue(FrameIndexProperty, value); }
}
/// <summary>
/// Свойство зависимоти - индес отображаемого кадра GIF-а.
/// </summary>
public static readonly DependencyProperty FrameIndexProperty =
DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new UIPropertyMetadata(0, ChangingFrameIndex));
private Uri _gifSource;
private double _framesPerSecond = 10.0;
static void ChangingFrameIndex (DependencyObject obj, DependencyPropertyChangedEventArgs ev)
{
var ob = (GifImage) obj;
ob.Source = ob._gf.Frames[(int) ev.NewValue];
ob.InvalidateVisual();
}
/// <summary>
/// Адрес отображаемого GIF-а.
/// </summary>
public Uri GifSource
{
get { return _gifSource; }
set
{
_gifSource = value;
RefreshGif();
}
}
/// <summary>
/// Скорость анимации GIF-а (кадров в секунду)
/// </summary>
public double FramesPerSecond
{
get { return _framesPerSecond; }
set
{
_framesPerSecond = value;
RefreshGif();
}
}
private void RefreshGif()
{
_gf = new GifBitmapDecoder(_gifSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
if (_gf.Frames != null)
{
_anim = new Int32Animation(0,
_gf.Frames.Count - 1,
new Duration(TimeSpan.FromSeconds(_gf.Frames.Count / FramesPerSecond)));
_anim.RepeatBehavior = RepeatBehavior.Forever;
Source = _gf.Frames[0];
}
}
protected override void OnRender (DrawingContext dc)
{
base.OnRender(dc);
if (!_animationIsWorking && _anim != null)
{
BeginAnimation(FrameIndexProperty, _anim);
_animationIsWorking = true;
}
}
}
}